<!doctype html><html lang="en">
 <head>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport">
  <title>Geolocation Sensor</title>
  <meta content="ED" name="w3c-status">
<style data-fill-with="stylesheet">/******************************************************************************
 *                   Style sheet for the W3C specifications                   *
 *
 * Special classes handled by this style sheet include:
 *
 * Indices
 *   - .toc for the Table of Contents (<ol class="toc">)
 *     + <span class="secno"> for the section numbers
 *   - #toc for the Table of Contents (<nav id="toc">)
 *   - ul.index for Indices (<a href="#ref">term</a><span>, in §N.M</span>)
 *   - table.index for Index Tables (e.g. for properties or elements)
 *
 * Structural Markup
 *   - table.data for general data tables
 *     -> use 'scope' attribute, <colgroup>, <thead>, and <tbody> for best results !
 *     -> use <table class='complex data'> for extra-complex tables
 *     -> use <td class='long'> for paragraph-length cell content
 *     -> use <td class='pre'> when manual line breaks/indentation would help readability
 *   - dl.switch for switch statements
 *   - ol.algorithm for algorithms (helps to visualize nesting)
 *   - .figure and .caption (HTML4) and figure and figcaption (HTML5)
 *     -> .sidefigure for right-floated figures
 *   - ins/del
 *
 * Code
 *   - pre and code
 *
 * Special Sections
 *   - .note       for informative notes             (div, p, span, aside, details)
 *   - .example    for informative examples          (div, p, pre, span)
 *   - .issue      for issues                        (div, p, span)
 *   - .assertion  for assertions                    (div, p, span)
 *   - .advisement for loud normative statements     (div, p, strong)
 *   - .annoying-warning for spec obsoletion notices (div, aside, details)
 *
 * Definition Boxes
 *   - pre.def   for WebIDL definitions
 *   - table.def for tables that define other entities (e.g. CSS properties)
 *   - dl.def    for definition lists that define other entitles (e.g. HTML elements)
 *
 * Numbering
 *   - .secno for section numbers in .toc and headings (<span class='secno'>3.2</span>)
 *   - .marker for source-inserted example/figure/issue numbers (<span class='marker'>Issue 4</span>)
 *   - ::before styled for CSS-generated issue/example/figure numbers:
 *     -> Documents wishing to use this only need to add
 *        figcaption::before,
 *        .caption::before { content: "Figure "  counter(figure) " ";  }
 *        .example::before { content: "Example " counter(example) " "; }
 *        .issue::before   { content: "Issue "   counter(issue) " ";   }
 *
 * Header Stuff (ignore, just don't conflict with these classes)
 *   - .head for the header
 *   - .copyright for the copyright
 *
 * Miscellaneous
 *   - .overlarge for things that should be as wide as possible, even if
 *     that overflows the body text area. This can be used on an item or
 *     on its container, depending on the effect desired.
 *     Note that this styling basically doesn't help at all when printing,
 *     since A4 paper isn't much wider than the max-width here.
 *     It's better to design things to fit into a narrower measure if possible.
 *   - js-added ToC jump links (see fixup.js)
 *
 ******************************************************************************/

/******************************************************************************/
/*                                   Body                                     */
/******************************************************************************/

	body {
		counter-reset: example figure issue;

		/* Layout */
		max-width: 50em;               /* limit line length to 50em for readability   */
		margin: 0 auto;                /* center text within page                     */
		padding: 1.6em 1.5em 2em 50px; /* assume 16px font size for downlevel clients */
		padding: 1.6em 1.5em 2em calc(26px + 1.5em); /* leave space for status flag     */

		/* Typography */
		line-height: 1.5;
		font-family: sans-serif;
		widows: 2;
		orphans: 2;
		word-wrap: break-word;
		overflow-wrap: break-word;
		hyphens: auto;

		/* Colors */
		color: black;
		background: white top left fixed no-repeat;
		background-size: 25px auto;
	}


/******************************************************************************/
/*                         Front Matter & Navigation                          */
/******************************************************************************/

/** Header ********************************************************************/

	div.head { margin-bottom: 1em }
	div.head hr { border-style: solid; }

	div.head h1 {
		font-weight: bold;
		margin: 0 0 .1em;
		font-size: 220%;
	}

	div.head h2 { margin-bottom: 1.5em;}

/** W3C Logo ******************************************************************/

	.head .logo {
		float: right;
		margin: 0.4rem 0 0.2rem .4rem;
	}

	.head img[src*="logos/W3C"] {
		display: block;
		border: solid #1a5e9a;
		border-width: .65rem .7rem .6rem;
		border-radius: .4rem;
		background: #1a5e9a;
		color: white;
		font-weight: bold;
	}

	.head a:hover > img[src*="logos/W3C"],
	.head a:focus > img[src*="logos/W3C"] {
		opacity: .8;
	}

	.head a:active > img[src*="logos/W3C"] {
		background: #c00;
		border-color: #c00;
	}

	/* see also additional rules in Link Styling section */

/** Copyright *****************************************************************/

	p.copyright,
	p.copyright small { font-size: small }

/** Back to Top / ToC Toggle **************************************************/

	@media print {
		#toc-nav {
			display: none;
		}
	}
	@media not print {
		#toc-nav {
			position: fixed;
			z-index: 2;
			bottom: 0; left: 0;
			margin: 0;
			min-width: 1.33em;
			border-top-right-radius: 2rem;
			box-shadow: 0 0 2px;
			font-size: 1.5em;
			color: black;
		}
		#toc-nav > a {
			display: block;
			white-space: nowrap;

			height: 1.33em;
			padding: .1em 0.3em;
			margin: 0;

			background: white;
			box-shadow: 0 0 2px;
			border: none;
			border-top-right-radius: 1.33em;
			background: white;
		}
		#toc-nav > #toc-jump {
			padding-bottom: 2em;
			margin-bottom: -1.9em;
		}

		#toc-nav > a:hover,
		#toc-nav > a:focus {
			background: #f8f8f8;
		}
		#toc-nav > a:not(:hover):not(:focus) {
			color: #707070;
		}

		/* statusbar gets in the way on keyboard focus; remove once browsers fix */
		#toc-nav > a[href="#toc"]:not(:hover):focus:last-child {
			padding-bottom: 1.5rem;
		}

		#toc-nav:not(:hover) > a:not(:focus) > span + span {
			/* Ideally this uses :focus-within on #toc-nav */
			display: none;
		}
		#toc-nav > a > span + span {
			padding-right: 0.2em;
		}

		#toc-toggle-inline {
			vertical-align: 0.05em;
			font-size: 80%;
			color: gray;
			color: hsla(203,20%,40%,.7);
			border-style: none;
			background: transparent;
			position: relative;
		}
		#toc-toggle-inline:hover:not(:active),
		#toc-toggle-inline:focus:not(:active) {
			text-shadow: 1px 1px silver;
			top: -1px;
			left: -1px;
		}

		#toc-nav :active {
			color: #C00;
		}
	}

/** ToC Sidebar ***************************************************************/

	/* Floating sidebar */
	@media screen {
		body.toc-sidebar #toc {
			position: fixed;
			top: 0; bottom: 0;
			left: 0;
			width: 23.5em;
			max-width: 80%;
			max-width: calc(100% - 2em - 26px);
			overflow: auto;
			padding: 0 1em;
			padding-left: 42px;
			padding-left: calc(1em + 26px);
			background: inherit;
			background-color: #f7f8f9;
			z-index: 1;
			box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset;
		}
		body.toc-sidebar #toc h2 {
			margin-top: .8rem;
			font-variant: small-caps;
			font-variant: all-small-caps;
			text-transform: lowercase;
			font-weight: bold;
			color: gray;
			color: hsla(203,20%,40%,.7);
		}
		body.toc-sidebar #toc-jump:not(:focus) {
			width: 0;
			height: 0;
			padding: 0;
			position: absolute;
			overflow: hidden;
		}
	}
	/* Hide main scroller when only the ToC is visible anyway */
	@media screen and (max-width: 28em) {
		body.toc-sidebar {
			overflow: hidden;
		}
	}

	/* Sidebar with its own space */
	@media screen and (min-width: 78em) {
		body:not(.toc-inline) #toc {
			position: fixed;
			top: 0; bottom: 0;
			left: 0;
			width: 23.5em;
			overflow: auto;
			padding: 0 1em;
			padding-left: 42px;
			padding-left: calc(1em + 26px);
			background: inherit;
			background-color: #f7f8f9;
			z-index: 1;
			box-shadow: -.1em 0 .25em rgba(0,0,0,.1) inset;
		}
		body:not(.toc-inline) #toc h2 {
			margin-top: .8rem;
			font-variant: small-caps;
			font-variant: all-small-caps;
			text-transform: lowercase;
			font-weight: bold;
			color: gray;
			color: hsla(203,20%,40%,.7);
		}

		body:not(.toc-inline) {
			padding-left: 29em;
		}
		/* See also Overflow section at the bottom */

		body:not(.toc-inline) #toc-jump:not(:focus) {
			width: 0;
			height: 0;
			padding: 0;
			position: absolute;
			overflow: hidden;
		}
	}
	@media screen and (min-width: 90em) {
		body:not(.toc-inline) {
			margin: 0 4em;
		}
	}

/******************************************************************************/
/*                                Sectioning                                  */
/******************************************************************************/

/** Headings ******************************************************************/

	h1, h2, h3, h4, h5, h6, dt {
		page-break-after: avoid;
		page-break-inside: avoid;
		font: 100% sans-serif;   /* Reset all font styling to clear out UA styles */
		font-family: inherit;    /* Inherit the font family. */
		line-height: 1.2;        /* Keep wrapped headings compact */
		hyphens: manual;         /* Hyphenated headings look weird */
	}

	h2, h3, h4, h5, h6 {
		margin-top: 3rem;
	}

	h1, h2, h3 {
		color: #005A9C;
		background: transparent;
	}

	h1 { font-size: 170%; }
	h2 { font-size: 140%; }
	h3 { font-size: 120%; }
	h4 { font-weight: bold; }
	h5 { font-style: italic; }
	h6 { font-variant: small-caps; }
	dt { font-weight: bold; }

/** Subheadings ***************************************************************/

	h1 + h2,
	#subtitle {
		/* #subtitle is a subtitle in an H2 under the H1 */
		margin-top: 0;
	}
	h2 + h3,
	h3 + h4,
	h4 + h5,
	h5 + h6 {
		margin-top: 1.2em; /* = 1 x line-height */
	}

/** Section divider ***********************************************************/

	:not(.head) > hr {
		font-size: 1.5em;
		text-align: center;
		margin: 1em auto;
		height: auto;
		border: transparent solid 0;
		background: transparent;
	}
	:not(.head) > hr::before {
		content: "\2727\2003\2003\2727\2003\2003\2727";
	}

/******************************************************************************/
/*                            Paragraphs and Lists                            */
/******************************************************************************/

	p {
		margin: 1em 0;
	}

	dd > p:first-child,
	li > p:first-child {
		margin-top: 0;
	}

	ul, ol {
		margin-left: 0;
		padding-left: 2em;
	}

	li {
		margin: 0.25em 0 0.5em;
		padding: 0;
	}

	dl dd {
		margin: 0 0 .5em 2em;
	}

	.head dd + dd { /* compact for header */
		margin-top: -.5em;
	}

	/* Style for algorithms */
	ol.algorithm ol:not(.algorithm),
	.algorithm > ol ol:not(.algorithm) {
	 border-left: 0.5em solid #DEF;
	}

	/* Put nice boxes around each algorithm. */
	[data-algorithm]:not(.heading) {
	  padding: .5em;
	  border: thin solid #ddd; border-radius: .5em;
	  margin: .5em calc(-0.5em - 1px);
	}
	[data-algorithm]:not(.heading) > :first-child {
	  margin-top: 0;
	}
	[data-algorithm]:not(.heading) > :last-child {
	  margin-bottom: 0;
	}

	/* Style for switch/case <dl>s */
	dl.switch > dd > ol.only,
	dl.switch > dd > .only > ol {
	 margin-left: 0;
	}
	dl.switch > dd > ol.algorithm,
	dl.switch > dd > .algorithm > ol {
	 margin-left: -2em;
	}
	dl.switch {
	 padding-left: 2em;
	}
	dl.switch > dt {
	 text-indent: -1.5em;
	 margin-top: 1em;
	}
	dl.switch > dt + dt {
	 margin-top: 0;
	}
	dl.switch > dt::before {
	 content: '\21AA';
	 padding: 0 0.5em 0 0;
	 display: inline-block;
	 width: 1em;
	 text-align: right;
	 line-height: 0.5em;
	}

/** Terminology Markup ********************************************************/


/******************************************************************************/
/*                                 Inline Markup                              */
/******************************************************************************/

/** Terminology Markup ********************************************************/
	dfn   { /* Defining instance */
		font-weight: bolder;
	}
	a > i { /* Instance of term */
		font-style: normal;
	}
	dt dfn code, code.idl {
		font-size: medium;
	}
	dfn var {
		font-style: normal;
	}

/** Change Marking ************************************************************/

	del { color: red;  text-decoration: line-through; }
	ins { color: #080; text-decoration: underline;    }

/** Miscellaneous improvements to inline formatting ***************************/

	sup {
		vertical-align: super;
		font-size: 80%
	}

/******************************************************************************/
/*                                    Code                                    */
/******************************************************************************/

/** General monospace/pre rules ***********************************************/

	pre, code, samp {
		font-family: Menlo, Consolas, "DejaVu Sans Mono", Monaco, monospace;
		font-size: .9em;
		page-break-inside: avoid;
		hyphens: none;
		text-transform: none;
	}
	pre code,
	code code {
		font-size: 100%;
	}

	pre {
		margin-top: 1em;
		margin-bottom: 1em;
		overflow: auto;
	}

/** Inline Code fragments *****************************************************/

  /* Do something nice. */

/******************************************************************************/
/*                                    Links                                   */
/******************************************************************************/

/** General Hyperlinks ********************************************************/

	/* We hyperlink a lot, so make it less intrusive */
	a[href] {
		color: #034575;
		text-decoration: none;
		border-bottom: 1px solid #707070;
		/* Need a bit of extending for it to look okay */
		padding: 0 1px 0;
		margin: 0 -1px 0;
	}
	a:visited {
		border-bottom-color: #BBB;
	}

	/* Use distinguishing colors when user is interacting with the link */
	a[href]:focus,
	a[href]:hover {
		background: #f8f8f8;
		background: rgba(75%, 75%, 75%, .25);
		border-bottom-width: 3px;
		margin-bottom: -2px;
	}
	a[href]:active {
		color: #C00;
		border-color: #C00;
	}

	/* Backout above styling for W3C logo */
	.head .logo,
	.head .logo a {
		border: none;
		text-decoration: none;
		background: transparent;
	}

/******************************************************************************/
/*                                    Images                                  */
/******************************************************************************/

	img {
		border-style: none;
	}

	/* For autogen numbers, add
	   .caption::before, figcaption::before { content: "Figure " counter(figure) ". "; }
	*/

	figure, .figure, .sidefigure {
		page-break-inside: avoid;
		text-align: center;
		margin: 2.5em 0;
	}
	.figure img,    .sidefigure img,    figure img,
	.figure object, .sidefigure object, figure object {
		max-width: 100%;
		margin: auto;
	}
	.figure pre, .sidefigure pre, figure pre {
		text-align: left;
		display: table;
		margin: 1em auto;
	}
	.figure table, figure table {
		margin: auto;
	}
	@media screen and (min-width: 20em) {
		.sidefigure {
			float: right;
			width: 50%;
			margin: 0 0 0.5em 0.5em
		}
	}
	.caption, figcaption, caption {
		font-style: italic;
		font-size: 90%;
	}
	.caption::before, figcaption::before, figcaption > .marker {
		font-weight: bold;
	}
	.caption, figcaption {
		counter-increment: figure;
	}

	/* DL list is indented 2em, but figure inside it is not */
	dd > .figure, dd > figure { margin-left: -2em }

/******************************************************************************/
/*                             Colored Boxes                                  */
/******************************************************************************/

	.issue, .note, .example, .assertion, .advisement, blockquote {
		padding: .5em;
		border: .5em;
		border-left-style: solid;
		page-break-inside: avoid;
	}
	span.issue, span.note {
		padding: .1em .5em .15em;
		border-right-style: solid;
	}

	.issue,
	.note,
	.example,
	.advisement,
	.assertion,
	blockquote {
		margin: 1em auto;
	}
	.note  > p:first-child,
	.issue > p:first-child,
	blockquote > :first-child {
		margin-top: 0;
	}
	blockquote > :last-child {
		margin-bottom: 0;
	}

/** Blockquotes ***************************************************************/

	blockquote {
		border-color: silver;
	}

/** Open issue ****************************************************************/

	.issue {
		border-color: #E05252;
		background: #FBE9E9;
		counter-increment: issue;
		overflow: auto;
	}
	.issue::before, .issue > .marker {
		text-transform: uppercase;
		color: #AE1E1E;
		padding-right: 1em;
		text-transform: uppercase;
	}
	/* Add .issue::before { content: "Issue " counter(issue) " "; } for autogen numbers,
	   or use class="marker" to mark up the issue number in source. */

/** Example *******************************************************************/

	.example {
		border-color: #E0CB52;
		background: #FCFAEE;
		counter-increment: example;
		overflow: auto;
		clear: both;
	}
	.example::before, .example > .marker {
		text-transform: uppercase;
		color: #827017;
		min-width: 7.5em;
		display: block;
	}
	/* Add .example::before { content: "Example " counter(example) " "; } for autogen numbers,
	   or use class="marker" to mark up the example number in source. */

/** Non-normative Note ********************************************************/

	.note {
		border-color: #52E052;
		background: #E9FBE9;
		overflow: auto;
	}

	.note::before, .note > .marker,
	details.note > summary::before,
	details.note > summary > .marker {
		text-transform: uppercase;
		display: block;
		color: hsl(120, 70%, 30%);
	}
	/* Add .note::before { content: "Note"; } for autogen label,
	   or use class="marker" to mark up the label in source. */

	details.note > summary {
		display: block;
		color: hsl(120, 70%, 30%);
	}
	details.note[open] > summary {
		border-bottom: 1px silver solid;
	}

/** Assertion Box *************************************************************/
	/*  for assertions in algorithms */

	.assertion {
		border-color: #AAA;
		background: #EEE;
	}

/** Advisement Box ************************************************************/
	/*  for attention-grabbing normative statements */

	.advisement {
		border-color: orange;
		border-style: none solid;
		background: #FFEECC;
	}
	strong.advisement {
		display: block;
		text-align: center;
	}
	.advisement > .marker {
		color: #B35F00;
	}

/** Spec Obsoletion Notice ****************************************************/
	/* obnoxious obsoletion notice for older/abandoned specs. */

	details {
		display: block;
	}
	summary {
		font-weight: bolder;
	}

	.annoying-warning:not(details),
	details.annoying-warning:not([open]) > summary,
	details.annoying-warning[open] {
		background: #fdd;
		color: red;
		font-weight: bold;
		padding: .75em 1em;
		border: thick red;
		border-style: solid;
		border-radius: 1em;
	}
	.annoying-warning :last-child {
		margin-bottom: 0;
	}

@media not print {
	details.annoying-warning[open] {
		position: fixed;
		left: 1em;
		right: 1em;
		bottom: 1em;
		z-index: 1000;
	}
}

	details.annoying-warning:not([open]) > summary {
		text-align: center;
	}

/** Entity Definition Boxes ***************************************************/

	.def {
		padding: .5em 1em;
		background: #DEF;
		margin: 1.2em 0;
		border-left: 0.5em solid #8CCBF2;
	}

/******************************************************************************/
/*                                    Tables                                  */
/******************************************************************************/

	th, td {
		text-align: left;
		text-align: start;
	}

/** Property/Descriptor Definition Tables *************************************/

	table.def {
		/* inherits .def box styling, see above */
		width: 100%;
		border-spacing: 0;
	}

	table.def td,
	table.def th {
		padding: 0.5em;
		vertical-align: baseline;
		border-bottom: 1px solid #bbd7e9;
	}

	table.def > tbody > tr:last-child th,
	table.def > tbody > tr:last-child td {
		border-bottom: 0;
	}

	table.def th {
		font-style: italic;
		font-weight: normal;
		padding-left: 1em;
		width: 3em;
	}

	/* For when values are extra-complex and need formatting for readability */
	table td.pre {
		white-space: pre-wrap;
	}

	/* A footnote at the bottom of a def table */
	table.def           td.footnote {
		padding-top: 0.6em;
	}
	table.def           td.footnote::before {
		content: " ";
		display: block;
		height: 0.6em;
		width: 4em;
		border-top: thin solid;
	}

/** Data tables (and properly marked-up index tables) *************************/
	/*
		 <table class="data"> highlights structural relationships in a table
		 when correct markup is used (e.g. thead/tbody, th vs. td, scope attribute)

		 Use class="complex data" for particularly complicated tables --
		 (This will draw more lines: busier, but clearer.)

		 Use class="long" on table cells with paragraph-like contents
		 (This will adjust text alignment accordingly.)
		 Alternately use class="longlastcol" on tables, to have the last column assume "long".
	*/

	table {
		word-wrap: normal;
		overflow-wrap: normal;
		hyphens: manual;
	}

	table.data,
	table.index {
		margin: 1em auto;
		border-collapse: collapse;
		border: hidden;
		width: 100%;
	}
	table.data caption,
	table.index caption {
		max-width: 50em;
		margin: 0 auto 1em;
	}

	table.data td,  table.data th,
	table.index td, table.index th {
		padding: 0.5em 1em;
		border-width: 1px;
		border-color: silver;
		border-top-style: solid;
	}

	table.data thead td:empty {
		padding: 0;
		border: 0;
	}

	table.data  thead,
	table.index thead,
	table.data  tbody,
	table.index tbody {
		border-bottom: 2px solid;
	}

	table.data colgroup,
	table.index colgroup {
		border-left: 2px solid;
	}

	table.data  tbody th:first-child,
	table.index tbody th:first-child  {
		border-right: 2px solid;
		border-top: 1px solid silver;
		padding-right: 1em;
	}

	table.data th[colspan],
	table.data td[colspan] {
		text-align: center;
	}

	table.complex.data th,
	table.complex.data td {
		border: 1px solid silver;
		text-align: center;
	}

	table.data.longlastcol td:last-child,
	table.data td.long {
	 vertical-align: baseline;
	 text-align: left;
	}

	table.data img {
		vertical-align: middle;
	}


/*
Alternate table alignment rules

	table.data,
	table.index {
		text-align: center;
	}

	table.data  thead th[scope="row"],
	table.index thead th[scope="row"] {
		text-align: right;
	}

	table.data  tbody th:first-child,
	table.index tbody th:first-child  {
		text-align: right;
	}

Possible extra rowspan handling

	table.data  tbody th[rowspan]:not([rowspan='1']),
	table.index tbody th[rowspan]:not([rowspan='1']),
	table.data  tbody td[rowspan]:not([rowspan='1']),
	table.index tbody td[rowspan]:not([rowspan='1']) {
		border-left: 1px solid silver;
	}

	table.data  tbody th[rowspan]:first-child,
	table.index tbody th[rowspan]:first-child,
	table.data  tbody td[rowspan]:first-child,
	table.index tbody td[rowspan]:first-child{
		border-left: 0;
		border-right: 1px solid silver;
	}
*/

/******************************************************************************/
/*                                  Indices                                   */
/******************************************************************************/


/** Table of Contents *********************************************************/

	.toc a {
		/* More spacing; use padding to make it part of the click target. */
		padding-top: 0.1rem;
		/* Larger, more consistently-sized click target */
		display: block;
		/* Reverse color scheme */
		color: black;
		border-color: #3980B5;
		border-bottom-width: 3px !important;
		margin-bottom: 0px !important;
	}
	.toc a:visited {
		border-color: #054572;
	}
	.toc a:not(:focus):not(:hover) {
		/* Allow colors to cascade through from link styling */
		border-bottom-color: transparent;
	}

	.toc, .toc ol, .toc ul, .toc li {
		list-style: none; /* Numbers must be inlined into source */
		/* because generated content isn't search/selectable and markers can't do multilevel yet */
		margin:  0;
		padding: 0;
		line-height: 1.1rem; /* consistent spacing */
	}

	/* ToC not indented until third level, but font style & margins show hierarchy */
	.toc > li             { font-weight: bold;   }
	.toc > li li          { font-weight: normal; }
	.toc > li li li       { font-size:   95%;    }
	.toc > li li li li    { font-size:   90%;    }
	.toc > li li li li .secno { font-size: 85%; }
	.toc > li li li li li { font-size:   85%;    }
	.toc > li li li li li .secno { font-size: 100%; }

	/* @supports not (display:grid) { */
		.toc > li             { margin: 1.5rem 0;    }
		.toc > li li          { margin: 0.3rem 0;    }
		.toc > li li li       { margin-left: 2rem;   }

		/* Section numbers in a column of their own */
		.toc .secno {
			float: left;
			width: 4rem;
			white-space: nowrap;
		}

		.toc li {
			clear: both;
		}

		:not(li) > .toc              { margin-left:  5rem; }
		.toc .secno                  { margin-left: -5rem; }
		.toc > li li li .secno       { margin-left: -7rem; }
		.toc > li li li li .secno    { margin-left: -9rem; }
		.toc > li li li li li .secno { margin-left: -11rem; }

		/* Tighten up indentation in narrow ToCs */
		@media (max-width: 30em) {
			:not(li) > .toc              { margin-left:  4rem; }
			.toc .secno                  { margin-left: -4rem; }
			.toc > li li li              { margin-left:  1rem; }
			.toc > li li li .secno       { margin-left: -5rem; }
			.toc > li li li li .secno    { margin-left: -6rem; }
			.toc > li li li li li .secno { margin-left: -7rem; }
		}
	/* } */

	@supports (display:grid) and (display:contents) {
		/* Use #toc over .toc to override non-@supports rules. */
		#toc {
			display: grid;
			align-content: start;
			grid-template-columns: auto 1fr;
			grid-column-gap: 1rem;
			column-gap: 1rem;
			grid-row-gap: .6rem;
			row-gap: .6rem;
		}
		#toc h2 {
			grid-column: 1 / -1;
			margin-bottom: 0;
		}
		#toc ol,
		#toc li,
		#toc a {
			display: contents;
			/* Switch <a> to subgrid when supported */
		}
		#toc span {
			margin: 0;
		}
		#toc > .toc > li > a > span {
			/* The spans of the top-level list,
			   comprising the first items of each top-level section. */
			margin-top: 1.1rem;
		}
		#toc#toc .secno { /* Ugh, need more specificity to override base.css */
			grid-column: 1;
			width: auto;
			margin-left: 0;
		}
		#toc .content {
			grid-column: 2;
			width: auto;
			margin-right: 1rem;
		}
		#toc .content:hover {
			background: rgba(75%, 75%, 75%, .25);
			border-bottom: 3px solid #054572;
			margin-bottom: -3px;
		}
		#toc li li li .content {
			margin-left: 1rem;
		}
		#toc li li li li .content {
			margin-left: 2rem;
		}
	}


/** Index *********************************************************************/

	/* Index Lists: Layout */
	ul.index       { margin-left: 0; columns: 15em; text-indent: 1em hanging; }
	ul.index li    { margin-left: 0; list-style: none; break-inside: avoid; }
	ul.index li li { margin-left: 1em }
	ul.index dl    { margin-top: 0; }
	ul.index dt    { margin: .2em 0 .2em 20px;}
	ul.index dd    { margin: .2em 0 .2em 40px;}
	/* Index Lists: Typography */
	ul.index ul,
	ul.index dl { font-size: smaller; }
	@media not print {
		ul.index li span {
			white-space: nowrap;
			color: transparent; }
		ul.index li a:hover + span,
		ul.index li a:focus + span {
			color: #707070;
		}
	}

/** Index Tables *****************************************************/
	/* See also the data table styling section, which this effectively subclasses */

	table.index {
		font-size: small;
		border-collapse: collapse;
		border-spacing: 0;
		text-align: left;
		margin: 1em 0;
	}

	table.index td,
	table.index th {
		padding: 0.4em;
	}

	table.index tr:hover td:not([rowspan]),
	table.index tr:hover th:not([rowspan]) {
		background: #f7f8f9;
	}

	/* The link in the first column in the property table (formerly a TD) */
	table.index th:first-child a {
		font-weight: bold;
	}

/******************************************************************************/
/*                                    Print                                   */
/******************************************************************************/

	@media print {
		/* Pages have their own margins. */
		html {
			margin: 0;
		}
		/* Serif for print. */
		body {
			font-family: serif;
		}
	}
	@page {
		margin: 1.5cm 1.1cm;
	}

/******************************************************************************/
/*                                    Legacy                                  */
/******************************************************************************/

	/* This rule is inherited from past style sheets. No idea what it's for. */
	.hide { display: none }



/******************************************************************************/
/*                             Overflow Control                               */
/******************************************************************************/

	.figure .caption, .sidefigure .caption, figcaption {
		/* in case figure is overlarge, limit caption to 50em */
		max-width: 50rem;
		margin-left: auto;
		margin-right: auto;
	}
	.overlarge {
		/* Magic to create good table positioning:
		   "content column" is 50ems wide at max; less on smaller screens.
		   Extra space (after ToC + content) is empty on the right.

		   1. When table < content column, centers table in column.
		   2. When content < table < available, left-aligns.
		   3. When table > available, fills available + scroll bar.
		*/ 
		display: grid;
		grid-template-columns: minmax(0, 50em);
	}
	.overlarge > table {
		/* limit preferred width of table */
		max-width: 50em;
		margin-left: auto;
		margin-right: auto;
	}

	@media (min-width: 55em) {
		.overlarge {
			margin-right: calc(13px + 26.5rem - 50vw);
			max-width: none;
		}
	}
	@media screen and (min-width: 78em) {
		body:not(.toc-inline) .overlarge {
			/* 30.5em body padding 50em content area */
			margin-right: calc(40em - 50vw) !important;
		}
	}
	@media screen and (min-width: 90em) {
		body:not(.toc-inline) .overlarge {
			/* 4em html margin 30.5em body padding 50em content area */
			margin-right: calc(84.5em - 100vw) !important;
		}
	}

	@media not print {
		.overlarge {
			overflow-x: auto;
			/* See Lea Verou's explanation background-attachment:
			 * http://lea.verou.me/2012/04/background-attachment-local/
			 *
			background: top left  / 4em 100% linear-gradient(to right,  #ffffff, rgba(255, 255, 255, 0)) local,
			            top right / 4em 100% linear-gradient(to left, #ffffff, rgba(255, 255, 255, 0)) local,
			            top left  / 1em 100% linear-gradient(to right,  #c3c3c5, rgba(195, 195, 197, 0)) scroll,
			            top right / 1em 100% linear-gradient(to left, #c3c3c5, rgba(195, 195, 197, 0)) scroll,
			            white;
			background-repeat: no-repeat;
			*/
		}
	}
</style>
<style>
    body {
      background: url("https://www.w3.org/StyleSheets/TR/logo-ED") top left no-repeat white;
      background-attachment: fixed;
    }
  </style>
  <link href="https://www.w3.org/TR/geolocation-sensor/" rel="canonical">
<style>/* style-md-lists */

/* This is a weird hack for me not yet following the commonmark spec
   regarding paragraph and lists. */
[data-md] > :first-child {
    margin-top: 0;
}
[data-md] > :last-child {
    margin-bottom: 0;
}</style>
<style>/* style-selflinks */

.heading, .issue, .note, .example, li, dt {
    position: relative;
}
a.self-link {
    position: absolute;
    top: 0;
    left: calc(-1 * (3.5rem - 26px));
    width: calc(3.5rem - 26px);
    height: 2em;
    text-align: center;
    border: none;
    transition: opacity .2s;
    opacity: .5;
}
a.self-link:hover {
    opacity: 1;
}
.heading > a.self-link {
    font-size: 83%;
}
li > a.self-link {
    left: calc(-1 * (3.5rem - 26px) - 2em);
}
dfn > a.self-link {
    top: auto;
    left: auto;
    opacity: 0;
    width: 1.5em;
    height: 1.5em;
    background: gray;
    color: white;
    font-style: normal;
    transition: opacity .2s, background-color .2s, color .2s;
}
dfn:hover > a.self-link {
    opacity: 1;
}
dfn > a.self-link:hover {
    color: black;
}

a.self-link::before            { content: "¶"; }
.heading > a.self-link::before { content: "§"; }
dfn > a.self-link::before      { content: "#"; }</style>
<style>/* style-counters */

body {
    counter-reset: example figure issue;
}
.issue {
    counter-increment: issue;
}
.issue:not(.no-marker)::before {
    content: "Issue " counter(issue);
}

.example {
    counter-increment: example;
}
.example:not(.no-marker)::before {
    content: "Example " counter(example);
}
.invalid.example:not(.no-marker)::before,
.illegal.example:not(.no-marker)::before {
    content: "Invalid Example" counter(example);
}

figcaption {
    counter-increment: figure;
}
figcaption:not(.no-marker)::before {
    content: "Figure " counter(figure) " ";
}</style>
<style>/* style-var-click-highlighting */

    var { cursor: pointer; }
    var.selected0 { background-color: #F4D200; box-shadow: 0 0 0 2px #F4D200; }
    var.selected1 { background-color: #FF87A2; box-shadow: 0 0 0 2px #FF87A2; }
    var.selected2 { background-color: #96E885; box-shadow: 0 0 0 2px #96E885; }
    var.selected3 { background-color: #3EEED2; box-shadow: 0 0 0 2px #3EEED2; }
    var.selected4 { background-color: #EACFB6; box-shadow: 0 0 0 2px #EACFB6; }
    var.selected5 { background-color: #82DDFF; box-shadow: 0 0 0 2px #82DDFF; }
    var.selected6 { background-color: #FFBCF2; box-shadow: 0 0 0 2px #FFBCF2; }
    </style>
<style>/* style-autolinks */

.css.css, .property.property, .descriptor.descriptor {
    color: #005a9c;
    font-size: inherit;
    font-family: inherit;
}
.css::before, .property::before, .descriptor::before {
    content: "‘";
}
.css::after, .property::after, .descriptor::after {
    content: "’";
}
.property, .descriptor {
    /* Don't wrap property and descriptor names */
    white-space: nowrap;
}
.type { /* CSS value <type> */
    font-style: italic;
}
pre .property::before, pre .property::after {
    content: "";
}
[data-link-type="property"]::before,
[data-link-type="propdesc"]::before,
[data-link-type="descriptor"]::before,
[data-link-type="value"]::before,
[data-link-type="function"]::before,
[data-link-type="at-rule"]::before,
[data-link-type="selector"]::before,
[data-link-type="maybe"]::before {
    content: "‘";
}
[data-link-type="property"]::after,
[data-link-type="propdesc"]::after,
[data-link-type="descriptor"]::after,
[data-link-type="value"]::after,
[data-link-type="function"]::after,
[data-link-type="at-rule"]::after,
[data-link-type="selector"]::after,
[data-link-type="maybe"]::after {
    content: "’";
}

[data-link-type].production::before,
[data-link-type].production::after,
.prod [data-link-type]::before,
.prod [data-link-type]::after {
    content: "";
}

[data-link-type=element],
[data-link-type=element-attr] {
    font-family: Menlo, Consolas, "DejaVu Sans Mono", monospace;
    font-size: .9em;
}
[data-link-type=element]::before { content: "<" }
[data-link-type=element]::after  { content: ">" }

[data-link-type=biblio] {
    white-space: pre;
}</style>
<style>/* style-dfn-panel */

.dfn-panel {
    position: absolute;
    z-index: 35;
    height: auto;
    width: -webkit-fit-content;
    width: fit-content;
    max-width: 300px;
    max-height: 500px;
    overflow: auto;
    padding: 0.5em 0.75em;
    font: small Helvetica Neue, sans-serif, Droid Sans Fallback;
    background: #DDDDDD;
    color: black;
    border: outset 0.2em;
}
.dfn-panel:not(.on) { display: none; }
.dfn-panel * { margin: 0; padding: 0; text-indent: 0; }
.dfn-panel > b { display: block; }
.dfn-panel a { color: black; }
.dfn-panel a:not(:hover) { text-decoration: none !important; border-bottom: none !important; }
.dfn-panel > b + b { margin-top: 0.25em; }
.dfn-panel ul { padding: 0; }
.dfn-panel li { list-style: inside; }
.dfn-panel.activated {
    display: inline-block;
    position: fixed;
    left: .5em;
    bottom: 2em;
    margin: 0 auto;
    max-width: calc(100vw - 1.5em - .4em - .5em);
    max-height: 30vh;
}

.dfn-paneled { cursor: pointer; }
</style>
<style>/* style-syntax-highlighting */
pre.idl.highlight { color: #708090; }
.highlight:not(.idl) { background: hsl(24, 20%, 95%); }
code.highlight { padding: .1em; border-radius: .3em; }
pre.highlight, pre > code.highlight { display: block; padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0; }
c-[a] { color: #990055 } /* Keyword.Declaration */
c-[b] { color: #990055 } /* Keyword.Type */
c-[c] { color: #708090 } /* Comment */
c-[d] { color: #708090 } /* Comment.Multiline */
c-[e] { color: #0077aa } /* Name.Attribute */
c-[f] { color: #669900 } /* Name.Tag */
c-[g] { color: #222222 } /* Name.Variable */
c-[k] { color: #990055 } /* Keyword */
c-[l] { color: #000000 } /* Literal */
c-[m] { color: #000000 } /* Literal.Number */
c-[n] { color: #0077aa } /* Name */
c-[o] { color: #999999 } /* Operator */
c-[p] { color: #999999 } /* Punctuation */
c-[s] { color: #a67f59 } /* Literal.String */
c-[t] { color: #a67f59 } /* Literal.String.Single */
c-[u] { color: #a67f59 } /* Literal.String.Double */
c-[cp] { color: #708090 } /* Comment.Preproc */
c-[c1] { color: #708090 } /* Comment.Single */
c-[cs] { color: #708090 } /* Comment.Special */
c-[kc] { color: #990055 } /* Keyword.Constant */
c-[kn] { color: #990055 } /* Keyword.Namespace */
c-[kp] { color: #990055 } /* Keyword.Pseudo */
c-[kr] { color: #990055 } /* Keyword.Reserved */
c-[ld] { color: #000000 } /* Literal.Date */
c-[nc] { color: #0077aa } /* Name.Class */
c-[no] { color: #0077aa } /* Name.Constant */
c-[nd] { color: #0077aa } /* Name.Decorator */
c-[ni] { color: #0077aa } /* Name.Entity */
c-[ne] { color: #0077aa } /* Name.Exception */
c-[nf] { color: #0077aa } /* Name.Function */
c-[nl] { color: #0077aa } /* Name.Label */
c-[nn] { color: #0077aa } /* Name.Namespace */
c-[py] { color: #0077aa } /* Name.Property */
c-[ow] { color: #999999 } /* Operator.Word */
c-[mb] { color: #000000 } /* Literal.Number.Bin */
c-[mf] { color: #000000 } /* Literal.Number.Float */
c-[mh] { color: #000000 } /* Literal.Number.Hex */
c-[mi] { color: #000000 } /* Literal.Number.Integer */
c-[mo] { color: #000000 } /* Literal.Number.Oct */
c-[sb] { color: #a67f59 } /* Literal.String.Backtick */
c-[sc] { color: #a67f59 } /* Literal.String.Char */
c-[sd] { color: #a67f59 } /* Literal.String.Doc */
c-[se] { color: #a67f59 } /* Literal.String.Escape */
c-[sh] { color: #a67f59 } /* Literal.String.Heredoc */
c-[si] { color: #a67f59 } /* Literal.String.Interpol */
c-[sx] { color: #a67f59 } /* Literal.String.Other */
c-[sr] { color: #a67f59 } /* Literal.String.Regex */
c-[ss] { color: #a67f59 } /* Literal.String.Symbol */
c-[vc] { color: #0077aa } /* Name.Variable.Class */
c-[vg] { color: #0077aa } /* Name.Variable.Global */
c-[vi] { color: #0077aa } /* Name.Variable.Instance */
c-[il] { color: #000000 } /* Literal.Number.Integer.Long */
</style>
 <body class="h-entry">
  <div class="head">
   <p data-fill-with="logo"><a class="logo" href="https://www.w3.org/"> <img alt="W3C" height="48" src="https://www.w3.org/StyleSheets/TR/2016/logos/W3C" width="72"> </a> </p>
   <h1 class="p-name no-ref" id="title">Geolocation Sensor</h1>
   <h2 class="no-num no-toc no-ref heading settled" id="subtitle"><span class="content">Editor’s Draft, <time class="dt-updated" datetime="1970-01-01">1 January 1970</time></span></h2>
   <div data-fill-with="spec-metadata">
    <dl>
     <dt>This version:
     <dd><a class="u-url" href="https://w3c.github.io/geolocation-sensor/">https://w3c.github.io/geolocation-sensor/</a>
     <dt>Latest published version:
     <dd><a href="https://www.w3.org/TR/geolocation-sensor/">https://www.w3.org/TR/geolocation-sensor/</a>
     <dt>Previous Versions:
     <dd><a href="https://www.w3.org/TR/2018/WD-geolocation-sensor-20180821/" rel="prev">https://www.w3.org/TR/2018/WD-geolocation-sensor-20180821/</a>
     <dt>Feedback:
     <dd><span><a href="mailto:public-device-apis@w3.org?subject=%5Bgeolocation-sensor%5D%20YOUR%20TOPIC%20HERE">public-device-apis@w3.org</a> with subject line “<kbd>[geolocation-sensor] <i data-lt>… message topic …</i></kbd>” (<a href="https://lists.w3.org/Archives/Public/public-device-apis/" rel="discussion">archives</a>)</span>
     <dt class="editor">Editors:
     <dd class="editor p-author h-card vcard" data-editor-id="41974"><a class="p-name fn u-url url" href="https://intel.com/">Anssi Kostiainen</a> (<span class="p-org org">Intel Corporation</span>)
     <dd class="editor p-author h-card vcard" data-editor-id="44965"><a class="p-name fn u-url url" href="https://google.com/">Thomas Steiner</a> (<span class="p-org org">Google Inc.</span>)
     <dd class="editor p-author h-card vcard"><a class="p-name fn u-url url" href="https://google.com/">Marijn Kruisselbrink</a> (<span class="p-org org">Google Inc.</span>)
     <dt>Participate:
     <dd><a href="https://github.com/w3c/geolocation-sensor">GitHub</a> (<a href="https://github.com/w3c/geolocation-sensor/issues/new">new issue</a>, <a href="https://github.com/w3c/geolocation-sensor/issues">open issues</a>)
     <dt>Tests:
     <dd><a href="https://github.com/web-platform-tests/wpt/tree/master/geolocation-sensor">web-platform-tests</a>
     <dt>Polyfills:
     <dd><a href="https://github.com/kenchris/sensor-polyfills/blob/master/src/geolocation-sensor.js">geolocation-sensor.js</a><br><a href="https://github.com/w3c/sensors/blob/master/polyfills/geolocation.js">geolocation.js</a>
    </dl>
   </div>
   <div data-fill-with="warning"></div>
   <p class="copyright" data-fill-with="copyright"><a href="https://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © 1970 <a href="https://www.w3.org/"><abbr title="World Wide Web Consortium">W3C</abbr></a><sup>®</sup> (<a href="https://www.csail.mit.edu/"><abbr title="Massachusetts Institute of Technology">MIT</abbr></a>, <a href="https://www.ercim.eu/"><abbr title="European Research Consortium for Informatics and Mathematics">ERCIM</abbr></a>, <a href="https://www.keio.ac.jp/">Keio</a>, <a href="https://ev.buaa.edu.cn/">Beihang</a>). W3C <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>, <a href="https://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a> and <a href="https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document" rel="license">permissive document license</a> rules apply. </p>
   <hr title="Separator for header">
  </div>
  <div class="p-summary" data-fill-with="abstract">
   <h2 class="no-num no-toc no-ref heading settled" id="abstract"><span class="content">Abstract</span></h2>
   <p>This specification defines the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor">GeolocationSensor</a></code> interface for obtaining

  the <a data-link-type="dfn" href="#geolocation" id="ref-for-geolocation">geolocation</a> of the hosting device.</p>
  </div>
  <h2 class="no-num no-toc no-ref heading settled" id="sotd"><span class="content">Status of this document</span></h2>
  <div data-fill-with="status">
   <p> This is a public copy of the editors’ draft.
	It is provided for discussion only and may change at any moment.
	Its publication here does not imply endorsement of its contents by W3C.
	Don’t cite this document other than as work in progress. </p>
   <p> If you wish to make comments regarding this document, please send them to <a href="mailto:public-device-apis@w3.org?Subject=%5Bgeolocation-sensor%5D%20PUT%20SUBJECT%20HERE">public-device-apis@w3.org</a> (<a href="mailto:public-device-apis-request@w3.org?subject=subscribe">subscribe</a>, <a href="https://lists.w3.org/Archives/Public/public-device-apis/">archives</a>).
	When sending e-mail,
	please put the text “geolocation-sensor” in the subject,
	preferably like this:
	“[geolocation-sensor] <em>…summary of comment…</em>”.
	All comments are welcome. </p>
   <p> This document was produced by the <a href="https://www.w3.org/das/">Devices and Sensors Working Group</a>. </p>
   <p> This document was produced by a group operating under
	the <a href="https://www.w3.org/Consortium/Patent-Policy/">W3C Patent Policy</a>.
	W3C maintains a <a href="https://www.w3.org/2004/01/pp-impl/43696/status" rel="disclosure">public list of any patent disclosures</a> made in connection with the deliverables of the group;
	that page also includes instructions for disclosing a patent.
	An individual who has actual knowledge of a patent which the individual believes contains <a href="https://www.w3.org/Consortium/Patent-Policy/#def-essential">Essential Claim(s)</a> must disclose the information in accordance with <a href="https://www.w3.org/Consortium/Patent-Policy/#sec-Disclosure">section 6 of the W3C Patent Policy</a>. </p>
   <p> This document is governed by the <a href="https://www.w3.org/2019/Process-20190301/" id="w3c_process_revision">1 March 2019 W3C Process Document</a>. </p>
   <p></p>
   <p class="note" role="note"><span>Note:</span> The work on the Geolocation API <a data-link-type="biblio" href="#biblio-geolocation-api">[GEOLOCATION-API]</a> has been concluded, and as such, any new feature development is happening in this Geolocation Sensor specification. The two specifications are expected to coexist.</p>
  </div>
  <div data-fill-with="at-risk"></div>
  <nav data-fill-with="table-of-contents" id="toc">
   <h2 class="no-num no-toc no-ref" id="contents">Table of Contents</h2>
   <ol class="toc" role="directory">
    <li><a href="#intro"><span class="secno">1</span> <span class="content">Introduction</span></a>
    <li><a href="#examples"><span class="secno">2</span> <span class="content">Examples</span></a>
    <li><a href="#security-and-privacy"><span class="secno">3</span> <span class="content">Security and Privacy Considerations</span></a>
    <li><a href="#model"><span class="secno">4</span> <span class="content">Model</span></a>
    <li>
     <a href="#api"><span class="secno">5</span> <span class="content">API</span></a>
     <ol class="toc">
      <li>
       <a href="#geolocationsensor-interface"><span class="secno">5.1</span> <span class="content">The GeolocationSensor Interface</span></a>
       <ol class="toc">
        <li><a href="#geolocationsensor-read"><span class="secno">5.1.1</span> <span class="content">GeolocationSensor.read()</span></a>
        <li><a href="#geolocationsensor-latitude"><span class="secno">5.1.2</span> <span class="content">GeolocationSensor.latitude</span></a>
        <li><a href="#geolocationsensor-longitude"><span class="secno">5.1.3</span> <span class="content">GeolocationSensor.longitude</span></a>
        <li><a href="#geolocationsensor-altitude"><span class="secno">5.1.4</span> <span class="content">GeolocationSensor.altitude</span></a>
        <li><a href="#geolocationsensor-accuracy"><span class="secno">5.1.5</span> <span class="content">GeolocationSensor.accuracy</span></a>
        <li><a href="#geolocationsensor-altitudeaccuracy"><span class="secno">5.1.6</span> <span class="content">GeolocationSensor.altitudeAccuracy</span></a>
        <li><a href="#geolocationsensor-heading"><span class="secno">5.1.7</span> <span class="content">GeolocationSensor.heading</span></a>
        <li><a href="#geolocationsensor-speed"><span class="secno">5.1.8</span> <span class="content">GeolocationSensor.speed</span></a>
       </ol>
     </ol>
    <li>
     <a href="#abstract-operations"><span class="secno">6</span> <span class="content">Abstract Operations</span></a>
     <ol class="toc">
      <li><a href="#construct-a-geolocation-sensor-object"><span class="secno">6.1</span> <span class="content">Construct a geolocation sensor object</span></a>
     </ol>
    <li>
     <a href="#automation"><span class="secno">7</span> <span class="content">Automation</span></a>
     <ol class="toc">
      <li><a href="#mock-geolocation-sensor-type"><span class="secno">7.1</span> <span class="content">Mock Sensor Type</span></a>
     </ol>
    <li>
     <a href="#use-cases"><span class="secno">8</span> <span class="content">Use Cases</span></a>
     <ol class="toc">
      <li><a href="#use-cases-categorization"><span class="secno">8.1</span> <span class="content">Categorization of use cases</span></a>
      <li>
       <a href="#use-cases-foreground-one-off"><span class="secno">8.2</span> <span class="content">Foreground—One-off geolocation update</span></a>
       <ol class="toc">
        <li><a href="#use-case-locate-a-user-on-a-map"><span class="secno">8.2.1</span> <span class="content">Locate a user on a map</span></a>
        <li><a href="#use-case-find-points-of-interest-in-the-users-area"><span class="secno">8.2.2</span> <span class="content">Find points of interest in the user’s area</span></a>
       </ol>
      <li>
       <a href="#use-cases-foreground-continuous"><span class="secno">8.3</span> <span class="content">Foreground—Continuous geolocation updates</span></a>
       <ol class="toc">
        <li><a href="#use-case-up-to-date-local-information"><span class="secno">8.3.1</span> <span class="content">Up-to-date local information</span></a>
        <li><a href="#use-case-alerts-when-points-of-interest-are-in-the-users-vicinity"><span class="secno">8.3.2</span> <span class="content">Alerts when points of interest are in the user’s vicinity</span></a>
        <li><a href="#use-case-show-the-users-position-on-a-map"><span class="secno">8.3.3</span> <span class="content">Show the user’s position on a map</span></a>
       </ol>
      <li>
       <a href="#use-cases-background-continuous"><span class="secno">8.4</span> <span class="content">Background—Continuous geolocation updates</span></a>
       <ol class="toc">
        <li><a href="#use-case-location-tagged-status-updates-in-social-networking-applications"><span class="secno">8.4.1</span> <span class="content">Location-tagged status updates in social networking applications</span></a>
        <li><a href="#use-case-turn-by-turn-route-navigation"><span class="secno">8.4.2</span> <span class="content">Turn-by-turn route navigation</span></a>
        <li><a href="#use-case-tracking-sports-activity"><span class="secno">8.4.3</span> <span class="content">Tracking sports activity</span></a>
        <li><a href="#use-case-real-estate-search"><span class="secno">8.4.4</span> <span class="content">Real estate search</span></a>
       </ol>
      <li>
       <a href="#use-cases-background-geofence"><span class="secno">8.5</span> <span class="content">Background—One-off geolocation fence alert</span></a>
       <ol class="toc">
        <li><a href="#use-case-reminder-and-todo-applications"><span class="secno">8.5.1</span> <span class="content">Reminder and to-do applications</span></a>
        <li><a href="#use-case-travel-applications"><span class="secno">8.5.2</span> <span class="content">Travel applications</span></a>
        <li><a href="#use-case-ticketing-or-booking-confirmations"><span class="secno">8.5.3</span> <span class="content">Ticketing or booking confirmations</span></a>
        <li><a href="#use-case-ride-share-applications"><span class="secno">8.5.4</span> <span class="content">Ride share applications</span></a>
        <li><a href="#use-case-retail-special-offers"><span class="secno">8.5.5</span> <span class="content">Retail special offers</span></a>
       </ol>
     </ol>
    <li><a href="#acknowledgements"><span class="secno">9</span> <span class="content">Acknowledgements</span></a>
    <li>
     <a href="#index"><span class="secno"></span> <span class="content">Index</span></a>
     <ol class="toc">
      <li><a href="#index-defined-here"><span class="secno"></span> <span class="content">Terms defined by this specification</span></a>
      <li><a href="#index-defined-elsewhere"><span class="secno"></span> <span class="content">Terms defined by reference</span></a>
     </ol>
    <li>
     <a href="#references"><span class="secno"></span> <span class="content">References</span></a>
     <ol class="toc">
      <li><a href="#normative"><span class="secno"></span> <span class="content">Normative References</span></a>
      <li><a href="#informative"><span class="secno"></span> <span class="content">Informative References</span></a>
     </ol>
    <li><a href="#idl-index"><span class="secno"></span> <span class="content">IDL Index</span></a>
   </ol>
  </nav>
  <main>
   <h2 class="heading settled" data-level="1" id="intro"><span class="secno">1. </span><span class="content">Introduction</span><a class="self-link" href="#intro"></a></h2>
   <p>The <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor①">GeolocationSensor</a></code> API extends the <code class="idl"><a data-link-type="idl" href="https://w3c.github.io/sensors/#sensor" id="ref-for-sensor">Sensor</a></code> interface <a data-link-type="biblio" href="#biblio-generic-sensor">[GENERIC-SENSOR]</a> to provide
information about the <a data-link-type="dfn" href="#geolocation" id="ref-for-geolocation①">geolocation</a> of the hosting device.</p>
   <p>The feature set of the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor②">GeolocationSensor</a></code> is similar to that of the Geolocation API <a data-link-type="biblio" href="#biblio-geolocation-api">[GEOLOCATION-API]</a>, but it is surfaced through a modern API that is consistent across <a href="https://www.w3.org/das/roadmap">contemporary sensor APIs</a>, improves <a data-link-type="dfn" href="https://w3c.github.io/sensors#security-and-privacy" id="ref-for-security-and-privacy">security and privacy</a>, and is <a data-link-type="dfn" href="https://w3c.github.io/sensors#extensibility" id="ref-for-extensibility">extensible</a>. The API aims to be <a href="https://github.com/kenchris/sensor-polyfills/blob/master/src/geolocation-sensor.js">polyfillable</a> (<a href="https://kenchris.github.io/sensor-polyfills/run-geolocation.html">example</a>)
on top of the existing Geolocation API.</p>
   <h2 class="heading settled" data-level="2" id="examples"><span class="secno">2. </span><span class="content">Examples</span><a class="self-link" href="#examples"></a></h2>
   <p> Get a new geolocation reading every second: </p>
   <div class="example" id="example-c8cdc575">
    <a class="self-link" href="#example-c8cdc575"></a> 
<pre class="highlight"><c- kr>const</c-> geo <c- o>=</c-> <c- k>new</c-> GeolocationSensor<c- p>({</c-> frequency<c- o>:</c-> <c- mi>1</c-> <c- p>});</c->
geo<c- p>.</c->start<c- p>();</c->

geo<c- p>.</c->onreading <c- o>=</c-> <c- p>()</c-> <c- p>=></c-> console<c- p>.</c->log<c- p>(</c-><c- sb>`lat: </c-><c- si>${</c->geo<c- p>.</c->latitude<c- si>}</c-><c- sb>, long: </c-><c- si>${</c->geo<c- p>.</c->longitude<c- si>}</c-><c- sb>`</c-><c- p>);</c->

geo<c- p>.</c->onerror <c- o>=</c-> event <c- p>=></c-> console<c- p>.</c->error<c- p>(</c->event<c- p>.</c->error<c- p>.</c->name<c- p>,</c-> event<c- p>.</c->error<c- p>.</c->message<c- p>);</c->
</pre>
   </div>
   <p> Get a one-shot geolocation reading: </p>
   <div class="example" id="example-9488bb9f">
    <a class="self-link" href="#example-9488bb9f"></a> 
<pre class="highlight">GeolocationSensor<c- p>.</c->read<c- p>()</c->
  <c- p>.</c->then<c- p>(</c->geo <c- p>=></c-> console<c- p>.</c->log<c- p>(</c-><c- sb>`lat: </c-><c- si>${</c->geo<c- p>.</c->latitude<c- si>}</c-><c- sb>, long: </c-><c- si>${</c->geo<c- p>.</c->longitude<c- si>}</c-><c- sb>`</c-><c- p>))</c->
  <c- p>.</c-><c- k>catch</c-><c- p>(</c->error <c- p>=></c-> console<c- p>.</c->error<c- p>(</c->error<c- p>.</c->name<c- p>));</c->
</pre>
   </div>
   <h2 class="heading settled" data-level="3" id="security-and-privacy"><span class="secno">3. </span><span class="content">Security and Privacy Considerations</span><a class="self-link" href="#security-and-privacy"></a></h2>
   <p class="note" role="note"><span>Note:</span> Investigate any geolocation-specific security and privacy considerations that are not
mitigated by the Generic Sensor API <a data-link-type="biblio" href="#biblio-generic-sensor">[GENERIC-SENSOR]</a>, and define geolocation-specific
mitigations.</p>
   <h2 class="heading settled" data-level="4" id="model"><span class="secno">4. </span><span class="content">Model</span><a class="self-link" href="#model"></a></h2>
   <p>The term <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="geolocation">geolocation</dfn> refers to the real-world geographic location of the
hosting device represented in geographic coordinates <a data-link-type="biblio" href="#biblio-wgs84">[WGS84]</a>.</p>
   <p class="note" role="note"><span>Note:</span> An implementation can use multiple location information sources to acquire <a data-link-type="dfn" href="#geolocation" id="ref-for-geolocation②">geolocation</a> information, and this specification is agnostic with respect
to those sources.</p>
   <p>The <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="geolocation-sensor">Geolocation Sensor</dfn> <a data-link-type="dfn" href="https://w3c.github.io/sensors#sensor-type" id="ref-for-sensor-type">sensor type</a>’s associated <code class="idl"><a data-link-type="idl" href="https://w3c.github.io/sensors/#sensor" id="ref-for-sensor①">Sensor</a></code> subclass is the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor③">GeolocationSensor</a></code> class.</p>
   <p>The <a data-link-type="dfn" href="#geolocation-sensor" id="ref-for-geolocation-sensor">Geolocation Sensor</a> has an associated <code class="idl"><a data-link-type="idl" href="https://w3c.github.io/permissions/#enumdef-permissionname" id="ref-for-enumdef-permissionname">PermissionName</a></code> which is <a class="idl-code" data-link-type="enum-value" href="https://w3c.github.io/permissions/#dom-permissionname-geolocation" id="ref-for-dom-permissionname-geolocation">"geolocation"</a>.</p>
   <p>A <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="latest-geolocation-reading">latest geolocation reading</dfn> is a <a data-link-type="dfn" href="https://w3c.github.io/sensors#latest-reading" id="ref-for-latest-reading">latest reading</a> for a <code class="idl"><a data-link-type="idl" href="https://w3c.github.io/sensors/#sensor" id="ref-for-sensor②">Sensor</a></code> of <a data-link-type="dfn" href="#geolocation-sensor" id="ref-for-geolocation-sensor①">Geolocation Sensor</a> <a data-link-type="dfn" href="https://w3c.github.io/sensors#sensor-type" id="ref-for-sensor-type①">sensor type</a>. It includes <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-entry" id="ref-for-map-entry">entries</a> whose <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-key" id="ref-for-map-key">keys</a> are "latitude", "longitude", "altitude", "accuracy", "altitudeAccuracy", "heading", "speed"
and whose <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-value" id="ref-for-map-value">values</a> contain the device’s <a data-link-type="dfn" href="#geolocation" id="ref-for-geolocation③">geolocation</a>.</p>
   <p class="note" role="note"><span>Note:</span> Consider adding a visual of the standard coordinate system for the Earth.</p>
   <h2 class="heading settled" data-level="5" id="api"><span class="secno">5. </span><span class="content">API</span><a class="self-link" href="#api"></a></h2>
   <h3 class="heading settled" data-level="5.1" id="geolocationsensor-interface"><span class="secno">5.1. </span><span class="content">The GeolocationSensor Interface</span><a class="self-link" href="#geolocationsensor-interface"></a></h3>
<pre class="idl highlight def">[<dfn class="idl-code" data-dfn-for="GeolocationSensor" data-dfn-type="constructor" data-export data-lt="GeolocationSensor(options)|GeolocationSensor()" id="dom-geolocationsensor-geolocationsensor"><code><c- g>Constructor</c-></code><a class="self-link" href="#dom-geolocationsensor-geolocationsensor"></a></dfn>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-geolocationsensoroptions" id="ref-for-dictdef-geolocationsensoroptions"><c- n>GeolocationSensorOptions</c-></a> <dfn class="idl-code" data-dfn-for="GeolocationSensor/GeolocationSensor(options)" data-dfn-type="argument" data-export id="dom-geolocationsensor-geolocationsensor-options-options"><code><c- g>options</c-></code><a class="self-link" href="#dom-geolocationsensor-geolocationsensor-options-options"></a></dfn> = {}),
 <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#SecureContext" id="ref-for-SecureContext"><c- g>SecureContext</c-></a>,
 <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed"><c- g>Exposed</c-></a>=(<c- n>DedicatedWorker</c->, <c- n>Window</c->)]
<c- b>interface</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="geolocationsensor"><code><c- g>GeolocationSensor</c-></code></dfn> : <a class="n" data-link-type="idl-name" href="https://w3c.github.io/sensors/#sensor" id="ref-for-sensor③"><c- n>Sensor</c-></a> {
  <c- b>static</c-> <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-geolocationsensorreading" id="ref-for-dictdef-geolocationsensorreading"><c- n>GeolocationSensorReading</c-></a>> <dfn class="dfn-paneled idl-code" data-dfn-for="GeolocationSensor" data-dfn-type="method" data-export data-lt="read(readOptions)|read()" id="dom-geolocationsensor-read"><code><c- g>read</c-></code></dfn>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-readoptions" id="ref-for-dictdef-readoptions"><c- n>ReadOptions</c-></a> <dfn class="idl-code" data-dfn-for="GeolocationSensor/read(readOptions), GeolocationSensor/read()" data-dfn-type="argument" data-export id="dom-geolocationsensor-read-readoptions-readoptions"><code><c- g>readOptions</c-></code><a class="self-link" href="#dom-geolocationsensor-read-readoptions-readoptions"></a></dfn> = {});
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double"><c- b>unrestricted</c-> <c- b>double</c-></a>? <dfn class="dfn-paneled idl-code" data-dfn-for="GeolocationSensor" data-dfn-type="attribute" data-export data-readonly data-type="unrestricted double?" id="dom-geolocationsensor-latitude"><code><c- g>latitude</c-></code></dfn>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double①"><c- b>unrestricted</c-> <c- b>double</c-></a>? <dfn class="dfn-paneled idl-code" data-dfn-for="GeolocationSensor" data-dfn-type="attribute" data-export data-readonly data-type="unrestricted double?" id="dom-geolocationsensor-longitude"><code><c- g>longitude</c-></code></dfn>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double②"><c- b>unrestricted</c-> <c- b>double</c-></a>? <dfn class="dfn-paneled idl-code" data-dfn-for="GeolocationSensor" data-dfn-type="attribute" data-export data-readonly data-type="unrestricted double?" id="dom-geolocationsensor-altitude"><code><c- g>altitude</c-></code></dfn>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double③"><c- b>unrestricted</c-> <c- b>double</c-></a>? <dfn class="dfn-paneled idl-code" data-dfn-for="GeolocationSensor" data-dfn-type="attribute" data-export data-readonly data-type="unrestricted double?" id="dom-geolocationsensor-accuracy"><code><c- g>accuracy</c-></code></dfn>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double④"><c- b>unrestricted</c-> <c- b>double</c-></a>? <dfn class="dfn-paneled idl-code" data-dfn-for="GeolocationSensor" data-dfn-type="attribute" data-export data-readonly data-type="unrestricted double?" id="dom-geolocationsensor-altitudeaccuracy"><code><c- g>altitudeAccuracy</c-></code></dfn>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double⑤"><c- b>unrestricted</c-> <c- b>double</c-></a>? <dfn class="dfn-paneled idl-code" data-dfn-for="GeolocationSensor" data-dfn-type="attribute" data-export data-readonly data-type="unrestricted double?" id="dom-geolocationsensor-heading"><code><c- g>heading</c-></code></dfn>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double⑥"><c- b>unrestricted</c-> <c- b>double</c-></a>? <dfn class="dfn-paneled idl-code" data-dfn-for="GeolocationSensor" data-dfn-type="attribute" data-export data-readonly data-type="unrestricted double?" id="dom-geolocationsensor-speed"><code><c- g>speed</c-></code></dfn>;
};

<c- b>dictionary</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="dictionary" data-export id="dictdef-geolocationsensoroptions"><code><c- g>GeolocationSensorOptions</c-></code></dfn> : <a class="n" data-link-type="idl-name" href="https://w3c.github.io/sensors/#dictdef-sensoroptions" id="ref-for-dictdef-sensoroptions"><c- n>SensorOptions</c-></a> {
  // placeholder for GeolocationSensor-specific options
};

<c- b>dictionary</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="dictionary" data-export id="dictdef-readoptions"><code><c- g>ReadOptions</c-></code></dfn> : <a class="n" data-link-type="idl-name" href="#dictdef-geolocationsensoroptions" id="ref-for-dictdef-geolocationsensoroptions①"><c- n>GeolocationSensorOptions</c-></a> {
  <a class="n" data-link-type="idl-name" href="https://dom.spec.whatwg.org/#abortsignal" id="ref-for-abortsignal"><c- n>AbortSignal</c-></a>? <dfn class="idl-code" data-dfn-for="ReadOptions" data-dfn-type="dict-member" data-export data-type="AbortSignal? " id="dom-readoptions-signal"><code><c- g>signal</c-></code><a class="self-link" href="#dom-readoptions-signal"></a></dfn>;
};

<c- b>dictionary</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="dictionary" data-export id="dictdef-geolocationsensorreading"><code><c- g>GeolocationSensorReading</c-></code></dfn> {
  <a class="n" data-link-type="idl-name" href="http://w3c.github.io/hr-time/#dom-domhighrestimestamp" id="ref-for-dom-domhighrestimestamp"><c- n>DOMHighResTimeStamp</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationSensorReading" data-dfn-type="dict-member" data-export data-type="DOMHighResTimeStamp? " id="dom-geolocationsensorreading-timestamp"><code><c- g>timestamp</c-></code><a class="self-link" href="#dom-geolocationsensorreading-timestamp"></a></dfn>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationSensorReading" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationsensorreading-latitude"><code><c- g>latitude</c-></code><a class="self-link" href="#dom-geolocationsensorreading-latitude"></a></dfn>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationSensorReading" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationsensorreading-longitude"><code><c- g>longitude</c-></code><a class="self-link" href="#dom-geolocationsensorreading-longitude"></a></dfn>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double②"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationSensorReading" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationsensorreading-altitude"><code><c- g>altitude</c-></code><a class="self-link" href="#dom-geolocationsensorreading-altitude"></a></dfn>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double③"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationSensorReading" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationsensorreading-accuracy"><code><c- g>accuracy</c-></code><a class="self-link" href="#dom-geolocationsensorreading-accuracy"></a></dfn>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double④"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationSensorReading" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationsensorreading-altitudeaccuracy"><code><c- g>altitudeAccuracy</c-></code><a class="self-link" href="#dom-geolocationsensorreading-altitudeaccuracy"></a></dfn>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑤"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationSensorReading" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationsensorreading-heading"><code><c- g>heading</c-></code><a class="self-link" href="#dom-geolocationsensorreading-heading"></a></dfn>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑥"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationSensorReading" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationsensorreading-speed"><code><c- g>speed</c-></code><a class="self-link" href="#dom-geolocationsensorreading-speed"></a></dfn>;
};

</pre>
   <div class="note" role="note">
     Normative changes to the <code> <a href="https://dev.w3.org/geo/api/spec-source.html#coordinates_interface"> Coordinates</a></code> interface of the Geolocation API are the following: 
    <ul>
     <li>Use <a href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="termref-for-"> unrestricted double</a> to not throw TypeError on NaN, +Infinity or −Infinity.
  (Geolocation API defines NaN as a valid value for heading, yet uses double as its type.) 
     <li>Use <a href="https://heycam.github.io/webidl/#dfn-nullable-type">nullable</a> to allow
  all attributes to default to null. (Geolocation API does not provide synchronous means to
  access these attributes, thus latitude, longitude, and altitude are not nullable and "must be
  supported by all implementations".) 
    </ul>
   </div>
   <p>To construct a <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor④">GeolocationSensor</a></code> object the user agent must invoke the <a data-link-type="dfn" href="#construct-a-geolocation-sensor-object" id="ref-for-construct-a-geolocation-sensor-object">construct a geolocation sensor object</a> abstract operation.</p>
   <h4 class="heading settled" data-level="5.1.1" id="geolocationsensor-read"><span class="secno">5.1.1. </span><span class="content">GeolocationSensor.read()</span><a class="self-link" href="#geolocationsensor-read"></a></h4>
   <p>The <code class="idl"><a data-link-type="idl" href="#dom-geolocationsensor-read" id="ref-for-dom-geolocationsensor-read">read()</a></code> method, when called, must run the following algorithm:</p>
   <div class="algorithm" data-algorithm="read">
    <dl>
     <dt data-md>input
     <dd data-md>
      <p><var>options</var>, a <code class="idl"><a data-link-type="idl" href="#dictdef-readoptions" id="ref-for-dictdef-readoptions①">ReadOptions</a></code> object.</p>
     <dt data-md>output
     <dd data-md>
      <p><var>p</var>, a promise.</p>
    </dl>
    <ol>
     <li data-md>
      <p>Let <var>p</var> be a new promise.</p>
     <li data-md>
      <p>Let <var>options</var> be the first argument.</p>
     <li data-md>
      <p>Let <var>signal</var> be the <var>options</var>’ dictionary member of the same name if present, or null otherwise.</p>
     <li data-md>
      <p>If <var>signal</var>’s <a data-link-type="dfn" href="https://dom.spec.whatwg.org#abortsignal-aborted-flag" id="ref-for-abortsignal-aborted-flag">aborted flag</a> is set, then reject <var>p</var> with an "<code class="idl"><a class="idl-code" data-link-type="exception" href="https://heycam.github.io/webidl/#aborterror" id="ref-for-aborterror">AbortError</a></code>" <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-DOMException" id="ref-for-idl-DOMException">DOMException</a></code> and return <var>p</var>.</p>
     <li data-md>
      <p>Let <var>geo</var> be the result of invoking <a data-link-type="dfn" href="#construct-a-geolocation-sensor-object" id="ref-for-construct-a-geolocation-sensor-object①">construct a Geolocation Sensor object</a> with <var>options</var>. If this throws a <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-DOMException" id="ref-for-idl-DOMException①">DOMException</a></code>, catch it, reject <var>p</var> with that <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-DOMException" id="ref-for-idl-DOMException②">DOMException</a></code>, and return <var>p</var>.</p>
     <li data-md>
      <p>Invoke <var>geo</var>.<code class="idl"><a data-link-type="idl" href="https://w3c.github.io/sensors/#dom-sensor-start" id="ref-for-dom-sensor-start">start()</a></code>.</p>
     <li data-md>
      <p>If <var>signal</var> is not null, then <a data-link-type="dfn" href="https://dom.spec.whatwg.org#abortsignal-add" id="ref-for-abortsignal-add">add the following abort steps</a> to <var>signal</var>:</p>
      <ol>
       <li data-md>
        <p>Invoke <var>geo</var>.<code class="idl"><a data-link-type="idl" href="https://w3c.github.io/sensors/#dom-sensor-stop" id="ref-for-dom-sensor-stop">stop()</a></code>.</p>
       <li data-md>
        <p>Reject <var>p</var> with an "<code class="idl"><a class="idl-code" data-link-type="exception" href="https://heycam.github.io/webidl/#aborterror" id="ref-for-aborterror①">AbortError</a></code>" <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-DOMException" id="ref-for-idl-DOMException③">DOMException</a></code> and abort these steps.</p>
      </ol>
     <li data-md>
      <p>Run these steps <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel" id="ref-for-in-parallel">in parallel</a>:</p>
      <ol>
       <li data-md>
        <p>If <a data-link-type="dfn" href="https://w3c.github.io/sensors/#notify-error" id="ref-for-notify-error">notify error</a> is invoked with <var>geo</var>, invoke <var>geo</var>.<code class="idl"><a data-link-type="idl" href="https://w3c.github.io/sensors/#dom-sensor-stop" id="ref-for-dom-sensor-stop①">stop()</a></code>, and reject <var>p</var> with the <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-DOMException" id="ref-for-idl-DOMException④">DOMException</a></code> passed as input to <a data-link-type="dfn" href="https://w3c.github.io/sensors/#notify-error" id="ref-for-notify-error①">notify error</a>.</p>
       <li data-md>
        <p>If <a data-link-type="dfn" href="https://w3c.github.io/sensors/#notify-new-reading" id="ref-for-notify-new-reading">notify new reading</a> is invoked with <var>geo</var>, then <a data-link-type="dfn" href="#resolve-a-geolocation-promise" id="ref-for-resolve-a-geolocation-promise">resolve a geolocation promise</a> with <var>geo</var> and <var>p</var>.</p>
      </ol>
     <li data-md>
      <p>Return <var>p</var>.</p>
    </ol>
   </div>
   <p class="note" role="note"> Implementations can reuse the same promise for multiple concurrent calls within the same browsing context if the arguments passed to <code class="idl"><a data-link-type="idl" href="#dom-geolocationsensor-read" id="ref-for-dom-geolocationsensor-read①">read()</a></code> are the same. </p>
   <p>To <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="resolve-a-geolocation-promise">resolve a geolocation promise</dfn> means to run the following steps:</p>
   <ol>
    <li data-md>
     <p>Let <var>reading</var> be a <code class="idl"><a data-link-type="idl" href="#dictdef-geolocationsensorreading" id="ref-for-dictdef-geolocationsensorreading①">GeolocationSensorReading</a></code>.</p>
    <li data-md>
     <p><a data-link-type="dfn" href="https://infra.spec.whatwg.org/#list-iterate" id="ref-for-list-iterate">For each</a> <var>key</var> → <var>value</var> of <a data-link-type="dfn" href="#latest-geolocation-reading" id="ref-for-latest-geolocation-reading">latest geolocation reading</a>:</p>
     <ol>
      <li data-md>
       <p><a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-set" id="ref-for-map-set">Set</a> <var>reading</var>[key] to <var>value</var>.</p>
     </ol>
    <li data-md>
     <p>Invoke <var>geo</var>.<code class="idl"><a data-link-type="idl" href="https://w3c.github.io/sensors/#dom-sensor-stop" id="ref-for-dom-sensor-stop②">stop()</a></code>.</p>
    <li data-md>
     <p>Resolve <var>p</var> with <var>reading</var>.</p>
   </ol>
   <h4 class="heading settled" data-level="5.1.2" id="geolocationsensor-latitude"><span class="secno">5.1.2. </span><span class="content">GeolocationSensor.latitude</span><a class="self-link" href="#geolocationsensor-latitude"></a></h4>
   <p>The <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-geolocationsensor-latitude" id="ref-for-dom-geolocationsensor-latitude">latitude</a></code> attribute of the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor⑤">GeolocationSensor</a></code> interface
returns the result of invoking <a data-link-type="dfn" href="https://w3c.github.io/sensors/#get-value-from-latest-reading" id="ref-for-get-value-from-latest-reading">get value from latest reading</a> with <code>this</code> and "latitude" as
arguments. It represents the latitude coordinate of the <a data-link-type="dfn" href="#geolocation" id="ref-for-geolocation④">geolocation</a> in decimal degrees <a data-link-type="biblio" href="#biblio-wgs84">[WGS84]</a>.</p>
   <h4 class="heading settled" data-level="5.1.3" id="geolocationsensor-longitude"><span class="secno">5.1.3. </span><span class="content">GeolocationSensor.longitude</span><a class="self-link" href="#geolocationsensor-longitude"></a></h4>
   <p>The <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-geolocationsensor-longitude" id="ref-for-dom-geolocationsensor-longitude">longitude</a></code> attribute of the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor⑥">GeolocationSensor</a></code> interface
returns the result of invoking <a data-link-type="dfn" href="https://w3c.github.io/sensors/#get-value-from-latest-reading" id="ref-for-get-value-from-latest-reading①">get value from latest reading</a> with <code>this</code> and "longitude" as
arguments. It represents the longitude coordinate of the <a data-link-type="dfn" href="#geolocation" id="ref-for-geolocation⑤">geolocation</a> in decimal degrees <a data-link-type="biblio" href="#biblio-wgs84">[WGS84]</a>.</p>
   <h4 class="heading settled" data-level="5.1.4" id="geolocationsensor-altitude"><span class="secno">5.1.4. </span><span class="content">GeolocationSensor.altitude</span><a class="self-link" href="#geolocationsensor-altitude"></a></h4>
   <p>The <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-geolocationsensor-altitude" id="ref-for-dom-geolocationsensor-altitude">altitude</a></code> attribute of the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor⑦">GeolocationSensor</a></code> interface
returns the result of invoking <a data-link-type="dfn" href="https://w3c.github.io/sensors/#get-value-from-latest-reading" id="ref-for-get-value-from-latest-reading②">get value from latest reading</a> with <code>this</code> and "altitude" as
arguments. It represents the <a data-link-type="dfn" href="#geolocation" id="ref-for-geolocation⑥">geolocation</a> in meters above the WGS 84 ellipsoid <a data-link-type="biblio" href="#biblio-wgs84">[WGS84]</a>.</p>
   <h4 class="heading settled" data-level="5.1.5" id="geolocationsensor-accuracy"><span class="secno">5.1.5. </span><span class="content">GeolocationSensor.accuracy</span><a class="self-link" href="#geolocationsensor-accuracy"></a></h4>
   <p>The <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-geolocationsensor-accuracy" id="ref-for-dom-geolocationsensor-accuracy">accuracy</a></code> attribute of the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor⑧">GeolocationSensor</a></code> interface
returns the result of invoking <a data-link-type="dfn" href="https://w3c.github.io/sensors/#get-value-from-latest-reading" id="ref-for-get-value-from-latest-reading③">get value from latest reading</a> with <code>this</code> and "accuracy" as
arguments. It represents the accuracy of the <a data-link-type="dfn" href="https://w3c.github.io/sensors#latest-reading" id="ref-for-latest-reading①">latest reading</a>["latitude"] value and <a data-link-type="dfn" href="https://w3c.github.io/sensors#latest-reading" id="ref-for-latest-reading②">latest reading</a>["longitude"] value in meters with a 95% confidence level.</p>
   <p>If the <a data-link-type="dfn" href="https://w3c.github.io/sensors#latest-reading" id="ref-for-latest-reading③">latest reading</a>["latitude"] value is null or <a data-link-type="dfn" href="https://w3c.github.io/sensors#latest-reading" id="ref-for-latest-reading④">latest reading</a>["longitude"] value is
null, it must return null.</p>
   <h4 class="heading settled" data-level="5.1.6" id="geolocationsensor-altitudeaccuracy"><span class="secno">5.1.6. </span><span class="content">GeolocationSensor.altitudeAccuracy</span><a class="self-link" href="#geolocationsensor-altitudeaccuracy"></a></h4>
   <p>The <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-geolocationsensor-altitudeaccuracy" id="ref-for-dom-geolocationsensor-altitudeaccuracy">altitudeAccuracy</a></code> attribute of the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor⑨">GeolocationSensor</a></code> interface returns the result of invoking <a data-link-type="dfn" href="https://w3c.github.io/sensors/#get-value-from-latest-reading" id="ref-for-get-value-from-latest-reading④">get value from latest reading</a> with <code>this</code> and
"altitudeAccuracy" as arguments. It represents the accuracy of the <a data-link-type="dfn" href="https://w3c.github.io/sensors#latest-reading" id="ref-for-latest-reading⑤">latest reading</a>["altitude"] value in meters with a 95% confidence level.</p>
   <p>If the <a data-link-type="dfn" href="https://w3c.github.io/sensors#latest-reading" id="ref-for-latest-reading⑥">latest reading</a>["altitude"] value is null, it must return null.</p>
   <h4 class="heading settled" data-level="5.1.7" id="geolocationsensor-heading"><span class="secno">5.1.7. </span><span class="content">GeolocationSensor.heading</span><a class="self-link" href="#geolocationsensor-heading"></a></h4>
   <p>The <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-geolocationsensor-heading" id="ref-for-dom-geolocationsensor-heading">heading</a></code> attribute of the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor①⓪">GeolocationSensor</a></code> interface
returns the result of invoking <a data-link-type="dfn" href="https://w3c.github.io/sensors/#get-value-from-latest-reading" id="ref-for-get-value-from-latest-reading⑤">get value from latest reading</a> with <code>this</code> and "heading" as
arguments. It represents the direction of travel in degrees counting clockwise relative to the
true north in the range 0 ≤ heading ≤ 360.</p>
   <h4 class="heading settled" data-level="5.1.8" id="geolocationsensor-speed"><span class="secno">5.1.8. </span><span class="content">GeolocationSensor.speed</span><a class="self-link" href="#geolocationsensor-speed"></a></h4>
   <p>The <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-geolocationsensor-speed" id="ref-for-dom-geolocationsensor-speed">speed</a></code> attribute of the <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor①①">GeolocationSensor</a></code> interface
returns the result of invoking <a data-link-type="dfn" href="https://w3c.github.io/sensors/#get-value-from-latest-reading" id="ref-for-get-value-from-latest-reading⑥">get value from latest reading</a> with <code>this</code> and "speed" as
arguments. It represents the magnitude of the horizontal component of the velocity in meters
per second.</p>
   <h2 class="heading settled" data-level="6" id="abstract-operations"><span class="secno">6. </span><span class="content">Abstract Operations</span><a class="self-link" href="#abstract-operations"></a></h2>
   <h3 class="heading settled dfn-paneled" data-dfn-type="dfn" data-export data-level="6.1" data-lt="Construct a geolocation sensor object" id="construct-a-geolocation-sensor-object"><span class="secno">6.1. </span><span class="content">Construct a geolocation sensor object</span></h3>
   <div class="algorithm" data-algorithm="construct a geolocation sensor object">
    <dl>
     <dt data-md>input
     <dd data-md>
      <p><var>options</var>, a <code class="idl"><a data-link-type="idl" href="#dictdef-geolocationsensoroptions" id="ref-for-dictdef-geolocationsensoroptions②">GeolocationSensorOptions</a></code> object.</p>
     <dt data-md>output
     <dd data-md>
      <p>A <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor①②">GeolocationSensor</a></code> object.</p>
    </dl>
    <ol>
     <li data-md>
      <p>Let <var>allowed</var> be the result of invoking <a data-link-type="dfn" href="https://w3c.github.io/sensors#check-sensor-policy-controlled-features" id="ref-for-check-sensor-policy-controlled-features">check sensor policy-controlled features</a> with <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor①③">GeolocationSensor</a></code>.</p>
     <li data-md>
      <p>If <var>allowed</var> is false, then:</p>
      <ol>
       <li data-md>
        <p><a data-link-type="dfn" href="https://heycam.github.io/webidl/#dfn-throw" id="ref-for-dfn-throw">Throw</a> a <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#securityerror" id="ref-for-securityerror">SecurityError</a></code> <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#idl-DOMException" id="ref-for-idl-DOMException⑤">DOMException</a></code>.</p>
      </ol>
     <li data-md>
      <p>Let <var>geo</var> be the new <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor①④">GeolocationSensor</a></code> object.</p>
     <li data-md>
      <p>Invoke <a data-link-type="dfn" href="https://w3c.github.io/sensors#initialize-a-sensor-object" id="ref-for-initialize-a-sensor-object">initialize a sensor object</a> with <var>geo</var> and <var>options</var>.</p>
     <li data-md>
      <p>Return <var>geo</var>.</p>
    </ol>
   </div>
   <h2 class="heading settled" data-level="7" id="automation"><span class="secno">7. </span><span class="content">Automation</span><a class="self-link" href="#automation"></a></h2>
    This section extends the <a data-link-type="dfn" href="https://w3c.github.io/sensors#automation" id="ref-for-automation">automation</a> section defined in the Generic Sensor API <a data-link-type="biblio" href="#biblio-generic-sensor">[GENERIC-SENSOR]</a> to provide mocking information about the <a data-link-type="dfn" href="#geolocation" id="ref-for-geolocation⑦">geolocation</a> of the hosting device for the purposes of
testing a user agent’s implementation of <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor①⑤">GeolocationSensor</a></code> API. 
   <h3 class="heading settled" data-level="7.1" id="mock-geolocation-sensor-type"><span class="secno">7.1. </span><span class="content">Mock Sensor Type</span><a class="self-link" href="#mock-geolocation-sensor-type"></a></h3>
   <p>The <code class="idl"><a data-link-type="idl" href="#geolocationsensor" id="ref-for-geolocationsensor①⑥">GeolocationSensor</a></code> class has an associated <a data-link-type="dfn" href="https://w3c.github.io/sensors#mock-sensor-type" id="ref-for-mock-sensor-type">mock sensor type</a> which is <a class="idl-code" data-link-type="enum-value" href="https://w3c.github.io/sensors/#dom-mocksensortype-geolocation" id="ref-for-dom-mocksensortype-geolocation">"geolocation"</a>, its <a data-link-type="dfn" href="https://w3c.github.io/sensors#mock-sensor-reading-values" id="ref-for-mock-sensor-reading-values">mock sensor reading values</a> dictionary is defined as follows:</p>
<pre class="idl highlight def"><c- b>dictionary</c-> <dfn class="idl-code" data-dfn-type="dictionary" data-export id="dictdef-geolocationreadingvalues"><code><c- g>GeolocationReadingValues</c-></code><a class="self-link" href="#dictdef-geolocationreadingvalues"></a></dfn> {
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑦"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationReadingValues" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationreadingvalues-latitude"><code><c- g>latitude</c-></code><a class="self-link" href="#dom-geolocationreadingvalues-latitude"></a></dfn>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑧"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationReadingValues" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationreadingvalues-longitude"><code><c- g>longitude</c-></code><a class="self-link" href="#dom-geolocationreadingvalues-longitude"></a></dfn>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑨"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationReadingValues" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationreadingvalues-altitude"><code><c- g>altitude</c-></code><a class="self-link" href="#dom-geolocationreadingvalues-altitude"></a></dfn>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①⓪"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationReadingValues" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationreadingvalues-accuracy"><code><c- g>accuracy</c-></code><a class="self-link" href="#dom-geolocationreadingvalues-accuracy"></a></dfn>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①①"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationReadingValues" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationreadingvalues-altitudeaccuracy"><code><c- g>altitudeAccuracy</c-></code><a class="self-link" href="#dom-geolocationreadingvalues-altitudeaccuracy"></a></dfn>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①②"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationReadingValues" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationreadingvalues-heading"><code><c- g>heading</c-></code><a class="self-link" href="#dom-geolocationreadingvalues-heading"></a></dfn>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①③"><c- b>double</c-></a>? <dfn class="idl-code" data-dfn-for="GeolocationReadingValues" data-dfn-type="dict-member" data-export data-type="double? " id="dom-geolocationreadingvalues-speed"><code><c- g>speed</c-></code><a class="self-link" href="#dom-geolocationreadingvalues-speed"></a></dfn>;
};
</pre>
   <h2 class="heading settled" data-level="8" id="use-cases"><span class="secno">8. </span><span class="content">Use Cases</span><a class="self-link" href="#use-cases"></a></h2>
   <h3 class="heading settled" data-level="8.1" id="use-cases-categorization"><span class="secno">8.1. </span><span class="content">Categorization of use cases</span><a class="self-link" href="#use-cases-categorization"></a></h3>
   <p>The mentioned use cases can roughly be grouped into four categories:</p>
   <ul>
    <li data-md>
     <p><strong>Foreground</strong> operations:</p>
     <ul>
      <li data-md>
       <p>Getting a <strong>one-off geolocation update</strong>.</p>
      <li data-md>
       <p>Getting <strong>continuous geolocation updates</strong> (<em>aka.</em> foreground geotracking).</p>
     </ul>
    <li data-md>
     <p><strong>Background</strong> operations:</p>
     <ul>
      <li data-md>
       <p>Getting <strong>continuous geolocation updates</strong> (<em>aka.</em> background geotracking).</p>
      <li data-md>
       <p>Getting a <strong>one-off geolocation fence alert</strong> (<em>aka.</em> background geofencing).</p>
     </ul>
   </ul>
   <p class="note" role="note"><span>Note:</span> Only the <strong>foreground operations</strong> were possible with <a data-link-type="biblio" href="#biblio-geolocation-api">[GEOLOCATION-API]</a>,
the <strong>background operations</strong> are completely novel.</p>
   <p>Core constraints when obtaining the gelocation are <strong>accuracy</strong> (<em>how close to the
actual position of the user is the determined position</em>) and <strong>latency</strong> (<em>how long does the user want to wait for a result</em>). Both are tradeoffs:
one can trade faster results for lower accuracy and vice versa.</p>
   <p>A common theme is to first obtain a rough estimation that then gets refined over time,
for example based initially on surrounding WiFi signals (which is fast to obtain)
and then eventually based on precise GPS data (which may take some time to find a signal).</p>
   <p>In the following, we list use cases based on the previously defined categories.</p>
   <p class="note" role="note"><span>Note:</span> The categories are not mutually exclusive and overlaps exist.
A task might start in the foreground, then continue in the background (for example,
while the user quickly responds to an incoming email),
and then eventually terminate in the foreground when the user multitasks back.</p>
   <h3 class="heading settled" data-level="8.2" id="use-cases-foreground-one-off"><span class="secno">8.2. </span><span class="content">Foreground—One-off geolocation update</span><a class="self-link" href="#use-cases-foreground-one-off"></a></h3>
   <h4 class="heading settled" data-level="8.2.1" id="use-case-locate-a-user-on-a-map"><span class="secno">8.2.1. </span><span class="content">Locate a user on a map</span><a class="self-link" href="#use-case-locate-a-user-on-a-map"></a></h4>
   <p>A mapping application can use the Geolocation Sensor API data of a user to locate them
on the map, essentially responding to the question "Where am I right now?"</p>
   <h4 class="heading settled" data-level="8.2.2" id="use-case-find-points-of-interest-in-the-users-area"><span class="secno">8.2.2. </span><span class="content">Find points of interest in the user’s area</span><a class="self-link" href="#use-case-find-points-of-interest-in-the-users-area"></a></h4>
   <p>Someone visiting a foreign city could access a web application that allows users
to search or browse through a database of tourist attractions. Using the Geolocation Sensor API,
the web application has access to the user’s approximate current position
and is therefore able to rank the search results by proximity to the user’s location.</p>
   <h3 class="heading settled" data-level="8.3" id="use-cases-foreground-continuous"><span class="secno">8.3. </span><span class="content">Foreground—Continuous geolocation updates</span><a class="self-link" href="#use-cases-foreground-continuous"></a></h3>
   <h4 class="heading settled" data-level="8.3.1" id="use-case-up-to-date-local-information"><span class="secno">8.3.1. </span><span class="content">Up-to-date local information</span><a class="self-link" href="#use-case-up-to-date-local-information"></a></h4>
   <p>A widget-like web application that shows the weather or news that are relevant
to the user’s current area can use the Geolocation Sensor API to register for location updates.
If the user’s position changes, the widget can adapt the content accordingly.</p>
   <h4 class="heading settled" data-level="8.3.2" id="use-case-alerts-when-points-of-interest-are-in-the-users-vicinity"><span class="secno">8.3.2. </span><span class="content">Alerts when points of interest are in the user’s vicinity</span><a class="self-link" href="#use-case-alerts-when-points-of-interest-are-in-the-users-vicinity"></a></h4>
   <p>A tour guide web application can use the Geolocation Sensor API to monitor the user’s position
and trigger visual or audio notifications when interesting places are in the vicinity.
An online task management system can trigger reminders when the user is in the proximity
of landmarks that are associated with certain tasks.
This use case assumes active usage of the application in the foreground.</p>
   <h4 class="heading settled" data-level="8.3.3" id="use-case-show-the-users-position-on-a-map"><span class="secno">8.3.3. </span><span class="content">Show the user’s position on a map</span><a class="self-link" href="#use-case-show-the-users-position-on-a-map"></a></h4>
   <p>A user finds themselves in an unfamiliar area. They want to check their position
so they use their handheld device to navigate to a web-based mapping application
that can pinpoint their exact location on the map using the Geolocation Sensor API.
They then ask the web application to provide driving directions from their current position
to their desired destination, essentially responding to the question "Where am I going?".</p>
   <h3 class="heading settled" data-level="8.4" id="use-cases-background-continuous"><span class="secno">8.4. </span><span class="content">Background—Continuous geolocation updates</span><a class="self-link" href="#use-cases-background-continuous"></a></h3>
   <h4 class="heading settled" data-level="8.4.1" id="use-case-location-tagged-status-updates-in-social-networking-applications"><span class="secno">8.4.1. </span><span class="content">Location-tagged status updates in social networking applications</span><a class="self-link" href="#use-case-location-tagged-status-updates-in-social-networking-applications"></a></h4>
   <p>A social networking application allows its users to automatically tag their status updates with
location information. It does this by monitoring the user’s position with the Geolocation Sensor API.
Each user can control the granularity of the location information (e.g., city or neighborhood level)
that is shared with the other users. Any user can also see their network of friends
and get real-time updates about their current location,
granted they have opted in to their location data being shared.
This use case intentionally conflates foreground location tagging and background location sharing.</p>
   <h4 class="heading settled" data-level="8.4.2" id="use-case-turn-by-turn-route-navigation"><span class="secno">8.4.2. </span><span class="content">Turn-by-turn route navigation</span><a class="self-link" href="#use-case-turn-by-turn-route-navigation"></a></h4>
   <p>A mapping application can help the user navigate along a routeby providing detailed turn-by-turn directions.
The application does this by registering with the Geolocation Sensor API to receive
repeated location updates of the user’s position. These updates are delivered as soon as the implementing
user agent determines that the position of the user has changed, which allows the application
to anticipate any changes of direction that the user might need to do.
The application can be in the foreground, but likewise can be backgrounded, for example,
when the user turns their device off to save battery on a long highway route section without side roads.</p>
   <h4 class="heading settled" data-level="8.4.3" id="use-case-tracking-sports-activity"><span class="secno">8.4.3. </span><span class="content">Tracking sports activity</span><a class="self-link" href="#use-case-tracking-sports-activity"></a></h4>
   <p>A web application can track a user’s sports activity, for example, a marathon run or a bicycle race.
Therefore, the application does not need to be on the screen, but would be backgrounded
while the user performs their activity, maybe with their handheld device strapped to their arm.</p>
   <h4 class="heading settled" data-level="8.4.4" id="use-case-real-estate-search"><span class="secno">8.4.4. </span><span class="content">Real estate search</span><a class="self-link" href="#use-case-real-estate-search"></a></h4>
   <p>A web application on a handheld device can notify a user of interesting available properties
in a neighborhood they are passing by where the property fits the user’s previously specified search criteria,
for example, 3 bedroom apartments with balcony.
This is based on the assumption that the number of possible matches is high,
that is, impossible to realize with geofences as the amount of required geofences would be too high.</p>
   <h3 class="heading settled" data-level="8.5" id="use-cases-background-geofence"><span class="secno">8.5. </span><span class="content">Background—One-off geolocation fence alert</span><a class="self-link" href="#use-cases-background-geofence"></a></h3>
   <h4 class="heading settled" data-level="8.5.1" id="use-case-reminder-and-todo-applications"><span class="secno">8.5.1. </span><span class="content">Reminder and to-do applications</span><a class="self-link" href="#use-case-reminder-and-todo-applications"></a></h4>
   <p>Reminder and to-do web applications can use a geofence to remind the user to do something when they cross it,
for example, to buy milk when they are near the supermarket.</p>
   <h4 class="heading settled" data-level="8.5.2" id="use-case-travel-applications"><span class="secno">8.5.2. </span><span class="content">Travel applications</span><a class="self-link" href="#use-case-travel-applications"></a></h4>
   <p>Travel applications can show venue specific data like WiFi passwords,
the user’s booking confirmation etc. only within geofence boundaries.</p>
   <h4 class="heading settled" data-level="8.5.3" id="use-case-ticketing-or-booking-confirmations"><span class="secno">8.5.3. </span><span class="content">Ticketing or booking confirmations</span><a class="self-link" href="#use-case-ticketing-or-booking-confirmations"></a></h4>
   <p>Ticketing or booking applications can bring up a ticket notification with a QR or bar code
once the user is near the venue of a concert or sports event or when they reach their rental car counter or similar.</p>
   <h4 class="heading settled" data-level="8.5.4" id="use-case-ride-share-applications"><span class="secno">8.5.4. </span><span class="content">Ride share applications</span><a class="self-link" href="#use-case-ride-share-applications"></a></h4>
   <p>Users can be informed if their designated driver reaches a pre-defined pickup point.</p>
   <h4 class="heading settled" data-level="8.5.5" id="use-case-retail-special-offers"><span class="secno">8.5.5. </span><span class="content">Retail special offers</span><a class="self-link" href="#use-case-retail-special-offers"></a></h4>
   <p>Given their previous consent, a user with a retailer’s web application installed on their handheld device
can be alerted about special offers or location-based coupons when they are
in vicinity of a physical presence of the retailer. Further, the in-store experience can be enriched,
for example, the retailer can let the user know something they have looked at before is actually available for pick up nearby.</p>
   <h2 class="heading settled" data-level="9" id="acknowledgements"><span class="secno">9. </span><span class="content">Acknowledgements</span><a class="self-link" href="#acknowledgements"></a></h2>
   <p>Thanks to Tobie Langel for the work on Generic Sensor API and the early geolocation.js polyfill.</p>
   <p>Thanks to Kenneth Rohde Christiansen for the geolocation-sensor.js polyfill and design proposals
during the incubation phase.</p>
   <p>Special thanks to the Geolocation Working Group participants for their work on the Geolocation API
from 2008 until 2017.</p>
  </main>
<script src="https://www.w3.org/scripts/TR/2016/fixup.js"></script>
  <h2 class="no-num no-ref heading settled" id="index"><span class="content">Index</span><a class="self-link" href="#index"></a></h2>
  <h3 class="no-num no-ref heading settled" id="index-defined-here"><span class="content">Terms defined by this specification</span><a class="self-link" href="#index-defined-here"></a></h3>
  <ul class="index">
   <li>
    accuracy
    <ul>
     <li><a href="#dom-geolocationsensor-accuracy">attribute for GeolocationSensor</a><span>, in §5.1</span>
     <li><a href="#dom-geolocationreadingvalues-accuracy">dict-member for GeolocationReadingValues</a><span>, in §7.1</span>
     <li><a href="#dom-geolocationsensorreading-accuracy">dict-member for GeolocationSensorReading</a><span>, in §5.1</span>
    </ul>
   <li>
    altitude
    <ul>
     <li><a href="#dom-geolocationsensor-altitude">attribute for GeolocationSensor</a><span>, in §5.1</span>
     <li><a href="#dom-geolocationreadingvalues-altitude">dict-member for GeolocationReadingValues</a><span>, in §7.1</span>
     <li><a href="#dom-geolocationsensorreading-altitude">dict-member for GeolocationSensorReading</a><span>, in §5.1</span>
    </ul>
   <li>
    altitudeAccuracy
    <ul>
     <li><a href="#dom-geolocationsensor-altitudeaccuracy">attribute for GeolocationSensor</a><span>, in §5.1</span>
     <li><a href="#dom-geolocationreadingvalues-altitudeaccuracy">dict-member for GeolocationReadingValues</a><span>, in §7.1</span>
     <li><a href="#dom-geolocationsensorreading-altitudeaccuracy">dict-member for GeolocationSensorReading</a><span>, in §5.1</span>
    </ul>
   <li><a href="#construct-a-geolocation-sensor-object">Construct a geolocation sensor object</a><span>, in §6</span>
   <li><a href="#geolocation">geolocation</a><span>, in §4</span>
   <li><a href="#dictdef-geolocationreadingvalues">GeolocationReadingValues</a><span>, in §7.1</span>
   <li><a href="#dom-geolocationsensor-geolocationsensor">GeolocationSensor()</a><span>, in §5.1</span>
   <li><a href="#geolocation-sensor">Geolocation Sensor</a><span>, in §4</span>
   <li><a href="#geolocationsensor">GeolocationSensor</a><span>, in §5.1</span>
   <li><a href="#dom-geolocationsensor-geolocationsensor">GeolocationSensor(options)</a><span>, in §5.1</span>
   <li><a href="#dictdef-geolocationsensoroptions">GeolocationSensorOptions</a><span>, in §5.1</span>
   <li><a href="#dictdef-geolocationsensorreading">GeolocationSensorReading</a><span>, in §5.1</span>
   <li>
    heading
    <ul>
     <li><a href="#dom-geolocationsensor-heading">attribute for GeolocationSensor</a><span>, in §5.1</span>
     <li><a href="#dom-geolocationreadingvalues-heading">dict-member for GeolocationReadingValues</a><span>, in §7.1</span>
     <li><a href="#dom-geolocationsensorreading-heading">dict-member for GeolocationSensorReading</a><span>, in §5.1</span>
    </ul>
   <li><a href="#latest-geolocation-reading">latest geolocation reading</a><span>, in §4</span>
   <li>
    latitude
    <ul>
     <li><a href="#dom-geolocationsensor-latitude">attribute for GeolocationSensor</a><span>, in §5.1</span>
     <li><a href="#dom-geolocationreadingvalues-latitude">dict-member for GeolocationReadingValues</a><span>, in §7.1</span>
     <li><a href="#dom-geolocationsensorreading-latitude">dict-member for GeolocationSensorReading</a><span>, in §5.1</span>
    </ul>
   <li>
    longitude
    <ul>
     <li><a href="#dom-geolocationsensor-longitude">attribute for GeolocationSensor</a><span>, in §5.1</span>
     <li><a href="#dom-geolocationreadingvalues-longitude">dict-member for GeolocationReadingValues</a><span>, in §7.1</span>
     <li><a href="#dom-geolocationsensorreading-longitude">dict-member for GeolocationSensorReading</a><span>, in §5.1</span>
    </ul>
   <li><a href="#dom-geolocationsensor-read">read()</a><span>, in §5.1</span>
   <li><a href="#dictdef-readoptions">ReadOptions</a><span>, in §5.1</span>
   <li><a href="#dom-geolocationsensor-read">read(readOptions)</a><span>, in §5.1</span>
   <li><a href="#resolve-a-geolocation-promise">resolve a geolocation promise</a><span>, in §5.1.1</span>
   <li><a href="#dom-readoptions-signal">signal</a><span>, in §5.1</span>
   <li>
    speed
    <ul>
     <li><a href="#dom-geolocationsensor-speed">attribute for GeolocationSensor</a><span>, in §5.1</span>
     <li><a href="#dom-geolocationreadingvalues-speed">dict-member for GeolocationReadingValues</a><span>, in §7.1</span>
     <li><a href="#dom-geolocationsensorreading-speed">dict-member for GeolocationSensorReading</a><span>, in §5.1</span>
    </ul>
   <li><a href="#dom-geolocationsensorreading-timestamp">timestamp</a><span>, in §5.1</span>
  </ul>
  <aside class="dfn-panel" data-for="term-for-abortsignal">
   <a href="https://dom.spec.whatwg.org/#abortsignal">https://dom.spec.whatwg.org/#abortsignal</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-abortsignal">5.1. The GeolocationSensor Interface</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-abortsignal-aborted-flag">
   <a href="https://dom.spec.whatwg.org#abortsignal-aborted-flag">https://dom.spec.whatwg.org#abortsignal-aborted-flag</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-abortsignal-aborted-flag">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-abortsignal-add">
   <a href="https://dom.spec.whatwg.org#abortsignal-add">https://dom.spec.whatwg.org#abortsignal-add</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-abortsignal-add">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-dom-mocksensortype-geolocation">
   <a href="https://w3c.github.io/sensors/#dom-mocksensortype-geolocation">https://w3c.github.io/sensors/#dom-mocksensortype-geolocation</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-mocksensortype-geolocation">7.1. Mock Sensor Type</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-sensor">
   <a href="https://w3c.github.io/sensors/#sensor">https://w3c.github.io/sensors/#sensor</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-sensor">1. Introduction</a>
    <li><a href="#ref-for-sensor①">4. Model</a> <a href="#ref-for-sensor②">(2)</a>
    <li><a href="#ref-for-sensor③">5.1. The GeolocationSensor Interface</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-dictdef-sensoroptions">
   <a href="https://w3c.github.io/sensors/#dictdef-sensoroptions">https://w3c.github.io/sensors/#dictdef-sensoroptions</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dictdef-sensoroptions">5.1. The GeolocationSensor Interface</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-automation">
   <a href="https://w3c.github.io/sensors#automation">https://w3c.github.io/sensors#automation</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-automation">7. Automation</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-check-sensor-policy-controlled-features">
   <a href="https://w3c.github.io/sensors#check-sensor-policy-controlled-features">https://w3c.github.io/sensors#check-sensor-policy-controlled-features</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-check-sensor-policy-controlled-features">6.1. Construct a geolocation sensor object</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-extensibility">
   <a href="https://w3c.github.io/sensors#extensibility">https://w3c.github.io/sensors#extensibility</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-extensibility">1. Introduction</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-get-value-from-latest-reading">
   <a href="https://w3c.github.io/sensors/#get-value-from-latest-reading">https://w3c.github.io/sensors/#get-value-from-latest-reading</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-get-value-from-latest-reading">5.1.2. GeolocationSensor.latitude</a>
    <li><a href="#ref-for-get-value-from-latest-reading①">5.1.3. GeolocationSensor.longitude</a>
    <li><a href="#ref-for-get-value-from-latest-reading②">5.1.4. GeolocationSensor.altitude</a>
    <li><a href="#ref-for-get-value-from-latest-reading③">5.1.5. GeolocationSensor.accuracy</a>
    <li><a href="#ref-for-get-value-from-latest-reading④">5.1.6. GeolocationSensor.altitudeAccuracy</a>
    <li><a href="#ref-for-get-value-from-latest-reading⑤">5.1.7. GeolocationSensor.heading</a>
    <li><a href="#ref-for-get-value-from-latest-reading⑥">5.1.8. GeolocationSensor.speed</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-initialize-a-sensor-object">
   <a href="https://w3c.github.io/sensors#initialize-a-sensor-object">https://w3c.github.io/sensors#initialize-a-sensor-object</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-initialize-a-sensor-object">6.1. Construct a geolocation sensor object</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-latest-reading">
   <a href="https://w3c.github.io/sensors#latest-reading">https://w3c.github.io/sensors#latest-reading</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-latest-reading">4. Model</a>
    <li><a href="#ref-for-latest-reading①">5.1.5. GeolocationSensor.accuracy</a> <a href="#ref-for-latest-reading②">(2)</a> <a href="#ref-for-latest-reading③">(3)</a> <a href="#ref-for-latest-reading④">(4)</a>
    <li><a href="#ref-for-latest-reading⑤">5.1.6. GeolocationSensor.altitudeAccuracy</a> <a href="#ref-for-latest-reading⑥">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-mock-sensor-reading-values">
   <a href="https://w3c.github.io/sensors#mock-sensor-reading-values">https://w3c.github.io/sensors#mock-sensor-reading-values</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-mock-sensor-reading-values">7.1. Mock Sensor Type</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-mock-sensor-type">
   <a href="https://w3c.github.io/sensors#mock-sensor-type">https://w3c.github.io/sensors#mock-sensor-type</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-mock-sensor-type">7.1. Mock Sensor Type</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-notify-error">
   <a href="https://w3c.github.io/sensors/#notify-error">https://w3c.github.io/sensors/#notify-error</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-notify-error">5.1.1. GeolocationSensor.read()</a> <a href="#ref-for-notify-error①">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-notify-new-reading">
   <a href="https://w3c.github.io/sensors/#notify-new-reading">https://w3c.github.io/sensors/#notify-new-reading</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-notify-new-reading">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-security-and-privacy">
   <a href="https://w3c.github.io/sensors#security-and-privacy">https://w3c.github.io/sensors#security-and-privacy</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-security-and-privacy">1. Introduction</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-sensor-type">
   <a href="https://w3c.github.io/sensors#sensor-type">https://w3c.github.io/sensors#sensor-type</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-sensor-type">4. Model</a> <a href="#ref-for-sensor-type①">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-dom-sensor-start">
   <a href="https://w3c.github.io/sensors/#dom-sensor-start">https://w3c.github.io/sensors/#dom-sensor-start</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-sensor-start">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-dom-sensor-stop">
   <a href="https://w3c.github.io/sensors/#dom-sensor-stop">https://w3c.github.io/sensors/#dom-sensor-stop</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-sensor-stop">5.1.1. GeolocationSensor.read()</a> <a href="#ref-for-dom-sensor-stop①">(2)</a> <a href="#ref-for-dom-sensor-stop②">(3)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-dom-domhighrestimestamp">
   <a href="http://w3c.github.io/hr-time/#dom-domhighrestimestamp">http://w3c.github.io/hr-time/#dom-domhighrestimestamp</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-domhighrestimestamp">5.1. The GeolocationSensor Interface</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-in-parallel">
   <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel">https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-in-parallel">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-map-entry">
   <a href="https://infra.spec.whatwg.org/#map-entry">https://infra.spec.whatwg.org/#map-entry</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-map-entry">4. Model</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-list-iterate">
   <a href="https://infra.spec.whatwg.org/#list-iterate">https://infra.spec.whatwg.org/#list-iterate</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-list-iterate">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-map-key">
   <a href="https://infra.spec.whatwg.org/#map-key">https://infra.spec.whatwg.org/#map-key</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-map-key">4. Model</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-map-set">
   <a href="https://infra.spec.whatwg.org/#map-set">https://infra.spec.whatwg.org/#map-set</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-map-set">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-map-value">
   <a href="https://infra.spec.whatwg.org/#map-value">https://infra.spec.whatwg.org/#map-value</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-map-value">4. Model</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-dom-permissionname-geolocation">
   <a href="https://w3c.github.io/permissions/#dom-permissionname-geolocation">https://w3c.github.io/permissions/#dom-permissionname-geolocation</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-permissionname-geolocation">4. Model</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-enumdef-permissionname">
   <a href="https://w3c.github.io/permissions/#enumdef-permissionname">https://w3c.github.io/permissions/#enumdef-permissionname</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-enumdef-permissionname">4. Model</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-aborterror">
   <a href="https://heycam.github.io/webidl/#aborterror">https://heycam.github.io/webidl/#aborterror</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-aborterror">5.1.1. GeolocationSensor.read()</a> <a href="#ref-for-aborterror①">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-DOMException">
   <a href="https://heycam.github.io/webidl/#idl-DOMException">https://heycam.github.io/webidl/#idl-DOMException</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-DOMException">5.1.1. GeolocationSensor.read()</a> <a href="#ref-for-idl-DOMException①">(2)</a> <a href="#ref-for-idl-DOMException②">(3)</a> <a href="#ref-for-idl-DOMException③">(4)</a> <a href="#ref-for-idl-DOMException④">(5)</a>
    <li><a href="#ref-for-idl-DOMException⑤">6.1. Construct a geolocation sensor object</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-Exposed">
   <a href="https://heycam.github.io/webidl/#Exposed">https://heycam.github.io/webidl/#Exposed</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-Exposed">5.1. The GeolocationSensor Interface</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-SecureContext">
   <a href="https://heycam.github.io/webidl/#SecureContext">https://heycam.github.io/webidl/#SecureContext</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-SecureContext">5.1. The GeolocationSensor Interface</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-securityerror">
   <a href="https://heycam.github.io/webidl/#securityerror">https://heycam.github.io/webidl/#securityerror</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-securityerror">6.1. Construct a geolocation sensor object</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-double">
   <a href="https://heycam.github.io/webidl/#idl-double">https://heycam.github.io/webidl/#idl-double</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-double">5.1. The GeolocationSensor Interface</a> <a href="#ref-for-idl-double①">(2)</a> <a href="#ref-for-idl-double②">(3)</a> <a href="#ref-for-idl-double③">(4)</a> <a href="#ref-for-idl-double④">(5)</a> <a href="#ref-for-idl-double⑤">(6)</a> <a href="#ref-for-idl-double⑥">(7)</a>
    <li><a href="#ref-for-idl-double⑦">7.1. Mock Sensor Type</a> <a href="#ref-for-idl-double⑧">(2)</a> <a href="#ref-for-idl-double⑨">(3)</a> <a href="#ref-for-idl-double①⓪">(4)</a> <a href="#ref-for-idl-double①①">(5)</a> <a href="#ref-for-idl-double①②">(6)</a> <a href="#ref-for-idl-double①③">(7)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-dfn-throw">
   <a href="https://heycam.github.io/webidl/#dfn-throw">https://heycam.github.io/webidl/#dfn-throw</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dfn-throw">6.1. Construct a geolocation sensor object</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="term-for-idl-unrestricted-double">
   <a href="https://heycam.github.io/webidl/#idl-unrestricted-double">https://heycam.github.io/webidl/#idl-unrestricted-double</a><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-idl-unrestricted-double">5.1. The GeolocationSensor Interface</a> <a href="#ref-for-idl-unrestricted-double①">(2)</a> <a href="#ref-for-idl-unrestricted-double②">(3)</a> <a href="#ref-for-idl-unrestricted-double③">(4)</a> <a href="#ref-for-idl-unrestricted-double④">(5)</a> <a href="#ref-for-idl-unrestricted-double⑤">(6)</a> <a href="#ref-for-idl-unrestricted-double⑥">(7)</a> <a href="#termref-for-">(8)</a>
   </ul>
  </aside>
  <h3 class="no-num no-ref heading settled" id="index-defined-elsewhere"><span class="content">Terms defined by reference</span><a class="self-link" href="#index-defined-elsewhere"></a></h3>
  <ul class="index">
   <li>
    <a data-link-type="biblio">[DOM]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-abortsignal" style="color:initial">AbortSignal</span>
     <li><span class="dfn-paneled" id="term-for-abortsignal-aborted-flag" style="color:initial">aborted flag</span>
     <li><span class="dfn-paneled" id="term-for-abortsignal-add" style="color:initial">add the following abort steps</span>
    </ul>
   <li>
    <a data-link-type="biblio">[GENERIC-SENSOR]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-dom-mocksensortype-geolocation" style="color:initial">"geolocation"</span>
     <li><span class="dfn-paneled" id="term-for-sensor" style="color:initial">Sensor</span>
     <li><span class="dfn-paneled" id="term-for-dictdef-sensoroptions" style="color:initial">SensorOptions</span>
     <li><span class="dfn-paneled" id="term-for-automation" style="color:initial">automation</span>
     <li><span class="dfn-paneled" id="term-for-check-sensor-policy-controlled-features" style="color:initial">check sensor policy-controlled features</span>
     <li><span class="dfn-paneled" id="term-for-extensibility" style="color:initial">extensible</span>
     <li><span class="dfn-paneled" id="term-for-get-value-from-latest-reading" style="color:initial">get value from latest reading</span>
     <li><span class="dfn-paneled" id="term-for-initialize-a-sensor-object" style="color:initial">initialize a sensor object</span>
     <li><span class="dfn-paneled" id="term-for-latest-reading" style="color:initial">latest reading</span>
     <li><span class="dfn-paneled" id="term-for-mock-sensor-reading-values" style="color:initial">mock sensor reading values</span>
     <li><span class="dfn-paneled" id="term-for-mock-sensor-type" style="color:initial">mock sensor type</span>
     <li><span class="dfn-paneled" id="term-for-notify-error" style="color:initial">notify error</span>
     <li><span class="dfn-paneled" id="term-for-notify-new-reading" style="color:initial">notify new reading</span>
     <li><span class="dfn-paneled" id="term-for-security-and-privacy" style="color:initial">security and privacy</span>
     <li><span class="dfn-paneled" id="term-for-sensor-type" style="color:initial">sensor type</span>
     <li><span class="dfn-paneled" id="term-for-dom-sensor-start" style="color:initial">start()</span>
     <li><span class="dfn-paneled" id="term-for-dom-sensor-stop" style="color:initial">stop()</span>
    </ul>
   <li>
    <a data-link-type="biblio">[hr-time-2]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-dom-domhighrestimestamp" style="color:initial">DOMHighResTimeStamp</span>
    </ul>
   <li>
    <a data-link-type="biblio">[HTML]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-in-parallel" style="color:initial">in parallel</span>
    </ul>
   <li>
    <a data-link-type="biblio">[INFRA]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-map-entry" style="color:initial">entry</span>
     <li><span class="dfn-paneled" id="term-for-list-iterate" style="color:initial">for each</span>
     <li><span class="dfn-paneled" id="term-for-map-key" style="color:initial">key</span>
     <li><span class="dfn-paneled" id="term-for-map-set" style="color:initial">set</span>
     <li><span class="dfn-paneled" id="term-for-map-value" style="color:initial">value</span>
    </ul>
   <li>
    <a data-link-type="biblio">[permissions]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-dom-permissionname-geolocation" style="color:initial">"geolocation"</span>
     <li><span class="dfn-paneled" id="term-for-enumdef-permissionname" style="color:initial">PermissionName</span>
    </ul>
   <li>
    <a data-link-type="biblio">[WebIDL]</a> defines the following terms:
    <ul>
     <li><span class="dfn-paneled" id="term-for-aborterror" style="color:initial">AbortError</span>
     <li><span class="dfn-paneled" id="term-for-idl-DOMException" style="color:initial">DOMException</span>
     <li><span class="dfn-paneled" id="term-for-Exposed" style="color:initial">Exposed</span>
     <li><span class="dfn-paneled" id="term-for-SecureContext" style="color:initial">SecureContext</span>
     <li><span class="dfn-paneled" id="term-for-securityerror" style="color:initial">SecurityError</span>
     <li><span class="dfn-paneled" id="term-for-idl-double" style="color:initial">double</span>
     <li><span class="dfn-paneled" id="term-for-dfn-throw" style="color:initial">throw</span>
     <li><span class="dfn-paneled" id="term-for-idl-unrestricted-double" style="color:initial">unrestricted double</span>
    </ul>
  </ul>
  <h2 class="no-num no-ref heading settled" id="references"><span class="content">References</span><a class="self-link" href="#references"></a></h2>
  <h3 class="no-num no-ref heading settled" id="normative"><span class="content">Normative References</span><a class="self-link" href="#normative"></a></h3>
  <dl>
   <dt id="biblio-dom">[DOM]
   <dd>Anne van Kesteren. <a href="https://dom.spec.whatwg.org/">DOM Standard</a>. Living Standard. URL: <a href="https://dom.spec.whatwg.org/">https://dom.spec.whatwg.org/</a>
   <dt id="biblio-generic-sensor">[GENERIC-SENSOR]
   <dd>Mikhail Pozdnyakov; Alexander Shalamov; Tobie Langel. <a href="https://w3c.github.io/sensors/">Generic Sensor API</a>. URL: <a href="https://w3c.github.io/sensors/">https://w3c.github.io/sensors/</a>
   <dt id="biblio-hr-time-2">[HR-TIME-2]
   <dd>Ilya Grigorik; James Simonsen; Jatinder Mann. <a href="https://w3c.github.io/hr-time/">High Resolution Time Level 2</a>. URL: <a href="https://w3c.github.io/hr-time/">https://w3c.github.io/hr-time/</a>
   <dt id="biblio-html">[HTML]
   <dd>Anne van Kesteren; et al. <a href="https://html.spec.whatwg.org/multipage/">HTML Standard</a>. Living Standard. URL: <a href="https://html.spec.whatwg.org/multipage/">https://html.spec.whatwg.org/multipage/</a>
   <dt id="biblio-infra">[INFRA]
   <dd>Anne van Kesteren; Domenic Denicola. <a href="https://infra.spec.whatwg.org/">Infra Standard</a>. Living Standard. URL: <a href="https://infra.spec.whatwg.org/">https://infra.spec.whatwg.org/</a>
   <dt id="biblio-permissions">[PERMISSIONS]
   <dd>Mounir Lamouri; Marcos Caceres; Jeffrey Yasskin. <a href="https://w3c.github.io/permissions/">Permissions</a>. URL: <a href="https://w3c.github.io/permissions/">https://w3c.github.io/permissions/</a>
   <dt id="biblio-webidl">[WebIDL]
   <dd>Boris Zbarsky. <a href="https://heycam.github.io/webidl/">Web IDL</a>. URL: <a href="https://heycam.github.io/webidl/">https://heycam.github.io/webidl/</a>
   <dt id="biblio-wgs84">[WGS84]
   <dd>National Imagery and Mapping Agency. <a href="http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf">Department of Defence World Geodetic System 1984</a>. Technical Report, Third Edition. URL: <a href="http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf">http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf</a>
  </dl>
  <h3 class="no-num no-ref heading settled" id="informative"><span class="content">Informative References</span><a class="self-link" href="#informative"></a></h3>
  <dl>
   <dt id="biblio-geolocation-api">[GEOLOCATION-API]
   <dd>Andrei Popescu. <a href="http://dev.w3.org/geo/api/spec-source.html">Geolocation API Specification 2nd Edition</a>. URL: <a href="http://dev.w3.org/geo/api/spec-source.html">http://dev.w3.org/geo/api/spec-source.html</a>
  </dl>
  <h2 class="no-num no-ref heading settled" id="idl-index"><span class="content">IDL Index</span><a class="self-link" href="#idl-index"></a></h2>
<pre class="idl highlight def">[<a href="#dom-geolocationsensor-geolocationsensor"><code><c- g>Constructor</c-></code></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-geolocationsensoroptions" id="ref-for-dictdef-geolocationsensoroptions③"><c- n>GeolocationSensorOptions</c-></a> <a href="#dom-geolocationsensor-geolocationsensor-options-options"><code><c- g>options</c-></code></a> = {}),
 <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#SecureContext" id="ref-for-SecureContext①"><c- g>SecureContext</c-></a>,
 <a class="idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed" id="ref-for-Exposed①"><c- g>Exposed</c-></a>=(<c- n>DedicatedWorker</c->, <c- n>Window</c->)]
<c- b>interface</c-> <a href="#geolocationsensor"><code><c- g>GeolocationSensor</c-></code></a> : <a class="n" data-link-type="idl-name" href="https://w3c.github.io/sensors/#sensor" id="ref-for-sensor③①"><c- n>Sensor</c-></a> {
  <c- b>static</c-> <c- b>Promise</c->&lt;<a class="n" data-link-type="idl-name" href="#dictdef-geolocationsensorreading" id="ref-for-dictdef-geolocationsensorreading②"><c- n>GeolocationSensorReading</c-></a>> <a href="#dom-geolocationsensor-read"><code><c- g>read</c-></code></a>(<c- b>optional</c-> <a class="n" data-link-type="idl-name" href="#dictdef-readoptions" id="ref-for-dictdef-readoptions②"><c- n>ReadOptions</c-></a> <a href="#dom-geolocationsensor-read-readoptions-readoptions"><code><c- g>readOptions</c-></code></a> = {});
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double⑦"><c- b>unrestricted</c-> <c- b>double</c-></a>? <a data-readonly data-type="unrestricted double?" href="#dom-geolocationsensor-latitude"><code><c- g>latitude</c-></code></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double①①"><c- b>unrestricted</c-> <c- b>double</c-></a>? <a data-readonly data-type="unrestricted double?" href="#dom-geolocationsensor-longitude"><code><c- g>longitude</c-></code></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double②①"><c- b>unrestricted</c-> <c- b>double</c-></a>? <a data-readonly data-type="unrestricted double?" href="#dom-geolocationsensor-altitude"><code><c- g>altitude</c-></code></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double③①"><c- b>unrestricted</c-> <c- b>double</c-></a>? <a data-readonly data-type="unrestricted double?" href="#dom-geolocationsensor-accuracy"><code><c- g>accuracy</c-></code></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double④①"><c- b>unrestricted</c-> <c- b>double</c-></a>? <a data-readonly data-type="unrestricted double?" href="#dom-geolocationsensor-altitudeaccuracy"><code><c- g>altitudeAccuracy</c-></code></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double⑤①"><c- b>unrestricted</c-> <c- b>double</c-></a>? <a data-readonly data-type="unrestricted double?" href="#dom-geolocationsensor-heading"><code><c- g>heading</c-></code></a>;
  <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-unrestricted-double" id="ref-for-idl-unrestricted-double⑥①"><c- b>unrestricted</c-> <c- b>double</c-></a>? <a data-readonly data-type="unrestricted double?" href="#dom-geolocationsensor-speed"><code><c- g>speed</c-></code></a>;
};

<c- b>dictionary</c-> <a href="#dictdef-geolocationsensoroptions"><code><c- g>GeolocationSensorOptions</c-></code></a> : <a class="n" data-link-type="idl-name" href="https://w3c.github.io/sensors/#dictdef-sensoroptions" id="ref-for-dictdef-sensoroptions①"><c- n>SensorOptions</c-></a> {
  // placeholder for GeolocationSensor-specific options
};

<c- b>dictionary</c-> <a href="#dictdef-readoptions"><code><c- g>ReadOptions</c-></code></a> : <a class="n" data-link-type="idl-name" href="#dictdef-geolocationsensoroptions" id="ref-for-dictdef-geolocationsensoroptions①①"><c- n>GeolocationSensorOptions</c-></a> {
  <a class="n" data-link-type="idl-name" href="https://dom.spec.whatwg.org/#abortsignal" id="ref-for-abortsignal①"><c- n>AbortSignal</c-></a>? <a data-type="AbortSignal? " href="#dom-readoptions-signal"><code><c- g>signal</c-></code></a>;
};

<c- b>dictionary</c-> <a href="#dictdef-geolocationsensorreading"><code><c- g>GeolocationSensorReading</c-></code></a> {
  <a class="n" data-link-type="idl-name" href="http://w3c.github.io/hr-time/#dom-domhighrestimestamp" id="ref-for-dom-domhighrestimestamp①"><c- n>DOMHighResTimeStamp</c-></a>? <a data-type="DOMHighResTimeStamp? " href="#dom-geolocationsensorreading-timestamp"><code><c- g>timestamp</c-></code></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①⑤"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationsensorreading-latitude"><code><c- g>latitude</c-></code></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①④"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationsensorreading-longitude"><code><c- g>longitude</c-></code></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double②①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationsensorreading-altitude"><code><c- g>altitude</c-></code></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double③①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationsensorreading-accuracy"><code><c- g>accuracy</c-></code></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double④①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationsensorreading-altitudeaccuracy"><code><c- g>altitudeAccuracy</c-></code></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑤①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationsensorreading-heading"><code><c- g>heading</c-></code></a>;
  <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑥①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationsensorreading-speed"><code><c- g>speed</c-></code></a>;
};


<c- b>dictionary</c-> <a href="#dictdef-geolocationreadingvalues"><code><c- g>GeolocationReadingValues</c-></code></a> {
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑦①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationreadingvalues-latitude"><code><c- g>latitude</c-></code></a>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑧①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationreadingvalues-longitude"><code><c- g>longitude</c-></code></a>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double⑨①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationreadingvalues-altitude"><code><c- g>altitude</c-></code></a>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①⓪①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationreadingvalues-accuracy"><code><c- g>accuracy</c-></code></a>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①①①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationreadingvalues-altitudeaccuracy"><code><c- g>altitudeAccuracy</c-></code></a>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①②①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationreadingvalues-heading"><code><c- g>heading</c-></code></a>;
  <c- b>required</c-> <a class="idl-code" data-link-type="interface" href="https://heycam.github.io/webidl/#idl-double" id="ref-for-idl-double①③①"><c- b>double</c-></a>? <a data-type="double? " href="#dom-geolocationreadingvalues-speed"><code><c- g>speed</c-></code></a>;
};

</pre>
  <aside class="dfn-panel" data-for="geolocation">
   <b><a href="#geolocation">#geolocation</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-geolocation①">1. Introduction</a>
    <li><a href="#ref-for-geolocation②">4. Model</a> <a href="#ref-for-geolocation③">(2)</a>
    <li><a href="#ref-for-geolocation④">5.1.2. GeolocationSensor.latitude</a>
    <li><a href="#ref-for-geolocation⑤">5.1.3. GeolocationSensor.longitude</a>
    <li><a href="#ref-for-geolocation⑥">5.1.4. GeolocationSensor.altitude</a>
    <li><a href="#ref-for-geolocation⑦">7. Automation</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="geolocation-sensor">
   <b><a href="#geolocation-sensor">#geolocation-sensor</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-geolocation-sensor">4. Model</a> <a href="#ref-for-geolocation-sensor①">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="latest-geolocation-reading">
   <b><a href="#latest-geolocation-reading">#latest-geolocation-reading</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-latest-geolocation-reading">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="geolocationsensor">
   <b><a href="#geolocationsensor">#geolocationsensor</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-geolocationsensor①">1. Introduction</a> <a href="#ref-for-geolocationsensor②">(2)</a>
    <li><a href="#ref-for-geolocationsensor③">4. Model</a>
    <li><a href="#ref-for-geolocationsensor④">5.1. The GeolocationSensor Interface</a>
    <li><a href="#ref-for-geolocationsensor⑤">5.1.2. GeolocationSensor.latitude</a>
    <li><a href="#ref-for-geolocationsensor⑥">5.1.3. GeolocationSensor.longitude</a>
    <li><a href="#ref-for-geolocationsensor⑦">5.1.4. GeolocationSensor.altitude</a>
    <li><a href="#ref-for-geolocationsensor⑧">5.1.5. GeolocationSensor.accuracy</a>
    <li><a href="#ref-for-geolocationsensor⑨">5.1.6. GeolocationSensor.altitudeAccuracy</a>
    <li><a href="#ref-for-geolocationsensor①⓪">5.1.7. GeolocationSensor.heading</a>
    <li><a href="#ref-for-geolocationsensor①①">5.1.8. GeolocationSensor.speed</a>
    <li><a href="#ref-for-geolocationsensor①②">6.1. Construct a geolocation sensor object</a> <a href="#ref-for-geolocationsensor①③">(2)</a> <a href="#ref-for-geolocationsensor①④">(3)</a>
    <li><a href="#ref-for-geolocationsensor①⑤">7. Automation</a>
    <li><a href="#ref-for-geolocationsensor①⑥">7.1. Mock Sensor Type</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-geolocationsensor-read">
   <b><a href="#dom-geolocationsensor-read">#dom-geolocationsensor-read</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-geolocationsensor-read">5.1.1. GeolocationSensor.read()</a> <a href="#ref-for-dom-geolocationsensor-read①">(2)</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-geolocationsensor-latitude">
   <b><a href="#dom-geolocationsensor-latitude">#dom-geolocationsensor-latitude</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-geolocationsensor-latitude">5.1.2. GeolocationSensor.latitude</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-geolocationsensor-longitude">
   <b><a href="#dom-geolocationsensor-longitude">#dom-geolocationsensor-longitude</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-geolocationsensor-longitude">5.1.3. GeolocationSensor.longitude</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-geolocationsensor-altitude">
   <b><a href="#dom-geolocationsensor-altitude">#dom-geolocationsensor-altitude</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-geolocationsensor-altitude">5.1.4. GeolocationSensor.altitude</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-geolocationsensor-accuracy">
   <b><a href="#dom-geolocationsensor-accuracy">#dom-geolocationsensor-accuracy</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-geolocationsensor-accuracy">5.1.5. GeolocationSensor.accuracy</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-geolocationsensor-altitudeaccuracy">
   <b><a href="#dom-geolocationsensor-altitudeaccuracy">#dom-geolocationsensor-altitudeaccuracy</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-geolocationsensor-altitudeaccuracy">5.1.6. GeolocationSensor.altitudeAccuracy</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-geolocationsensor-heading">
   <b><a href="#dom-geolocationsensor-heading">#dom-geolocationsensor-heading</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-geolocationsensor-heading">5.1.7. GeolocationSensor.heading</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dom-geolocationsensor-speed">
   <b><a href="#dom-geolocationsensor-speed">#dom-geolocationsensor-speed</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dom-geolocationsensor-speed">5.1.8. GeolocationSensor.speed</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dictdef-geolocationsensoroptions">
   <b><a href="#dictdef-geolocationsensoroptions">#dictdef-geolocationsensoroptions</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dictdef-geolocationsensoroptions">5.1. The GeolocationSensor Interface</a> <a href="#ref-for-dictdef-geolocationsensoroptions①">(2)</a>
    <li><a href="#ref-for-dictdef-geolocationsensoroptions②">6.1. Construct a geolocation sensor object</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dictdef-readoptions">
   <b><a href="#dictdef-readoptions">#dictdef-readoptions</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dictdef-readoptions">5.1. The GeolocationSensor Interface</a>
    <li><a href="#ref-for-dictdef-readoptions①">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="dictdef-geolocationsensorreading">
   <b><a href="#dictdef-geolocationsensorreading">#dictdef-geolocationsensorreading</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-dictdef-geolocationsensorreading">5.1. The GeolocationSensor Interface</a>
    <li><a href="#ref-for-dictdef-geolocationsensorreading①">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="resolve-a-geolocation-promise">
   <b><a href="#resolve-a-geolocation-promise">#resolve-a-geolocation-promise</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-resolve-a-geolocation-promise">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
  <aside class="dfn-panel" data-for="construct-a-geolocation-sensor-object">
   <b><a href="#construct-a-geolocation-sensor-object">#construct-a-geolocation-sensor-object</a></b><b>Referenced in:</b>
   <ul>
    <li><a href="#ref-for-construct-a-geolocation-sensor-object">5.1. The GeolocationSensor Interface</a>
    <li><a href="#ref-for-construct-a-geolocation-sensor-object①">5.1.1. GeolocationSensor.read()</a>
   </ul>
  </aside>
<script>/* script-var-click-highlighting */

    document.addEventListener("click", e=>{
        if(e.target.nodeName == "VAR") {
            highlightSameAlgoVars(e.target);
        }
    });
    {
        const indexCounts = new Map();
        const indexNames = new Map();
        function highlightSameAlgoVars(v) {
            // Find the algorithm container.
            let algoContainer = null;
            let searchEl = v;
            while(algoContainer == null && searchEl != document.body) {
                searchEl = searchEl.parentNode;
                if(searchEl.hasAttribute("data-algorithm")) {
                    algoContainer = searchEl;
                }
            }

            // Not highlighting document-global vars,
            // too likely to be unrelated.
            if(algoContainer == null) return;

            const algoName = algoContainer.getAttribute("data-algorithm");
            const varName = getVarName(v);
            const addClass = !v.classList.contains("selected");
            let highlightClass = null;
            if(addClass) {
                const index = chooseHighlightIndex(algoName, varName);
                indexCounts.get(algoName)[index] += 1;
                indexNames.set(algoName+"///"+varName, index);
                highlightClass = nameFromIndex(index);
            } else {
                const index = previousHighlightIndex(algoName, varName);
                indexCounts.get(algoName)[index] -= 1;
                highlightClass = nameFromIndex(index);
            }

            // Find all same-name vars, and toggle their class appropriately.
            for(const el of algoContainer.querySelectorAll("var")) {
                if(getVarName(el) == varName) {
                    el.classList.toggle("selected", addClass);
                    el.classList.toggle(highlightClass, addClass);
                }
            }
        }
        function getVarName(el) {
            return el.textContent.replace(/(\s| )+/, " ").trim();
        }
        function chooseHighlightIndex(algoName, varName) {
            let indexes = null;
            if(indexCounts.has(algoName)) {
                indexes = indexCounts.get(algoName);
            } else {
                // 7 classes right now
                indexes = [0,0,0,0,0,0,0];
                indexCounts.set(algoName, indexes);
            }

            // If the element was recently unclicked,
            // *and* that color is still unclaimed,
            // give it back the same color.
            const lastIndex = previousHighlightIndex(algoName, varName);
            if(indexes[lastIndex] === 0) return lastIndex;

            // Find the earliest index with the lowest count.
            const minCount = Math.min.apply(null, indexes);
            let index = null;
            for(var i = 0; i < indexes.length; i++) {
                if(indexes[i] == minCount) {
                    return i;
                }
            }
        }
        function previousHighlightIndex(algoName, varName) {
            return indexNames.get(algoName+"///"+varName);
        }
        function nameFromIndex(index) {
            return "selected" + index;
        }
    }
    </script>
<script>/* script-dfn-panel */

document.body.addEventListener("click", function(e) {
    var queryAll = function(sel) { return [].slice.call(document.querySelectorAll(sel)); }
    // Find the dfn element or panel, if any, that was clicked on.
    var el = e.target;
    var target;
    var hitALink = false;
    while(el.parentElement) {
        if(el.tagName == "A") {
            // Clicking on a link in a <dfn> shouldn't summon the panel
            hitALink = true;
        }
        if(el.classList.contains("dfn-paneled")) {
            target = "dfn";
            break;
        }
        if(el.classList.contains("dfn-panel")) {
            target = "dfn-panel";
            break;
        }
        el = el.parentElement;
    }
    if(target != "dfn-panel") {
        // Turn off any currently "on" or "activated" panels.
        queryAll(".dfn-panel.on, .dfn-panel.activated").forEach(function(el){
            el.classList.remove("on");
            el.classList.remove("activated");
        });
    }
    if(target == "dfn" && !hitALink) {
        // open the panel
        var dfnPanel = document.querySelector(".dfn-panel[data-for='" + el.id + "']");
        if(dfnPanel) {
            dfnPanel.classList.add("on");
            var rect = el.getBoundingClientRect();
            dfnPanel.style.left = window.scrollX + rect.right + 5 + "px";
            dfnPanel.style.top = window.scrollY + rect.top + "px";
            var panelRect = dfnPanel.getBoundingClientRect();
            var panelWidth = panelRect.right - panelRect.left;
            if(panelRect.right > document.body.scrollWidth && (rect.left - (panelWidth + 5)) > 0) {
                // Reposition, because the panel is overflowing
                dfnPanel.style.left = window.scrollX + rect.left - (panelWidth + 5) + "px";
            }
        } else {
            console.log("Couldn't find .dfn-panel[data-for='" + el.id + "']");
        }
    } else if(target == "dfn-panel") {
        // Switch it to "activated" state, which pins it.
        el.classList.add("activated");
        el.style.left = null;
        el.style.top = null;
    }

});
</script>